码迷,mamicode.com
首页 > 编程语言 > 详细

Python之Django--ORM连表操作

时间:2016-04-21 23:41:12      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:

一对多

class UserType(models.Model):
    caption = models.CharField(max_length=32)

class UserInfo(models.Model):
    user_type = models.ForeignKey(UserType)# user_type对象中封装id,caption
    username = models.CharField(max_length=32)
    age = models.IntegerField()

增:

1.外键id添加 

models.UserInfo.objects.create(username=xs,age=19,user_type_id=1)

2.直接添加外键的对象

obj = models.UserType(caption=haha)
obj.save()
models.UserInfo.objects.create(username=xs,age=18,user_type=obj)

查:

  正向查询:根据userinfo查usertype

result = models.UserInfo.objects.filter(user_type__caption=CTO)
for item in result:
    print item.username,item.age,item.user_type.caption

  反向查询:根据usertype查userinfo

result = models.UserType.objects.get(id=1)
    print -->0,result
    print -->1,result.userinfo_set
    print -->2,result.userinfo_set.all()
    print -->3,result.userinfo_set.filter(username=xs) #用字段条件查询
    print -->4,models.UserInfo.objects.filter(user_type=result) #用对象条件查询

    user_type_obj = models.UserType.objects.get(userinfo__username=xs)
    print -->0,user_type_obj.caption
    print -->1,user_type_obj.userinfo_set.all().count()
    return HttpResponse(ok)

多对多

class Host(models.Model):
    hostname = models.CharField(max_length=32)
    port = models.IntegerField()

class HostAdmin(models.Model):
    username = models.CharField(max_length=32)
    email = models.CharField(max_length=32)
    host = models.ManyToManyField(Host)

增:

  正向增:

admin_obj = models.HostAdmin.objects.get(username=xs)
host_list = models.Host.objects.filter(id__lt=3)
admin_obj.host.add(*host_list)

  反向增:

host_obj = models.Host.objects.get(id=3)
admin_list= models.HostAdmin.objects.filter(id__gt=1)
host_obj.hostadmin_set.add(*admin_list)

区别总结:区别在于正向查拥有自己创建好的host句柄,可以直接使用add方法添加,而反向查没有,所以要使用django为我们提供的set句柄。

#正向增加

admin_obj = models.HostAdmin.objects.get(username=xs)
host_list = models.Host.objects.filter(id__lt=3)
admin_obj.host.add(*host_list)

#反向添加

host_obj = model.Host.objects.get(id=3)
admin_list = models.HostAdmin.objects.filter(id__gt=1)
host_obj.hostadmin_set.add(*admin_list)

查:

#正向查
    admin_obj = models.HostAdmin.objects.get(username=xs)
    print admin_obj.host.all()
 #反向查
    host_obj = models.Host.objects.get(id=3)
    print host_obj.hostadmin_set.all()
技术分享
class Host1(models.Model):
    hostname = models.CharField(max_length=32)
    port = models.IntegerField()

class HostAdmin1(models.Model):
    username = models.CharField(max_length=32)
    email = models.CharField(max_length=32)
    host = models.ManyToManyField(Host1,through=HostRelation)

class HostRelation(models.Model):
    host =models.ForeignKey(Host1)
    admin =models.ForeignKey(HostAdmin1)
自定义多对多表创建
技术分享
#
    #models.HostRelation.objects.create(host_id=1,admin_id=1)
    #
    relationList = models.HostRelation.objects.all()
    for item in relationList:
        print item.host.hostname
        print item.admin.username
自定义多对多表操作

 

Python之Django--ORM连表操作

标签:

原文地址:http://www.cnblogs.com/fanweibin/p/5419136.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!