一对多 多对多表查询

经典的例子:一本书有多个作者,一个作者有多本书,典型的多对多关系。

设计模型如下:

view plaincopy to clipboardprint?
01.from django.db import models  
02.  
03.class Author(models.Model):  
04.    first_name = models.CharField(max_length=30)  
05.    last_name = models.CharField(max_length=40)  
06.    email = models.EmailField()  
07.      
08.    def __unicode__(self):  
09.        return self.name  
10.      
11.    class Meta:  
12.        db_table = "author"       
13.      
14.class Book(models.Model):  
15.    title = models.CharField(max_length=200)  
16.    authors = models.ManyToManyField(Author)  
17.      
18.    def __unicode__(self):  
19.        return self.title  
20.      
21.    class Meta:  
22.        db_table = "book"    

访问多值:

一本书的所有作者:

b = Book.objects.get(id=50)

b.authors.all()

b.authors.filter(first_name='Adam')

反向也可以,一个作者的所有书:

a = Author.objects.get(id=1)

a.book_set.all()

给多对多字段添加值(添加多对多关系):

a = Author.objects.get(id=1)

b = Book.objects.get(id=50)

b.authors.add(a)

从多对多字段中删除值(删除多对多关系):

a = Author.objects.get(id=1)

b = Book.objects.get(id=50)

b.authors.remove(a) 或者 b.authors.filter(id=1).delete()

一对多关系 = 外键

用户组表

1. ATG
2. dragon
3. OA
4. SAP


主机信息表

c1pd001    1.1.1.1     1(ATG)
c1pd002    1.1.1.2     2(ATG)
c1pd003    1.1.1.3     3(ATG)
c1pd004    1.1.1.4     4(ATG)

原生sql
    insert into  asset values(hostname='c1pd005',ip='1.1.1.5',groupid=1)

django
    1.获取用户表对象
    2.插入主机表
    
    groupid = models.UserGroup.object.get(id=groupId)
    models.asset.object.create(username=username,password=password,user_group=groupid)
    
跨表查询
    obj = models.asset.object.filters(user_group__Groupname = '用户组A')
    
多对多关系

#############表结构############
class UserInfo(models.Model):
    name = models.CharField(max_length=32)


class UserGroup(models.Model):
    caption = models.CharField(max_length=64)
    user_info = models.ManyToManyField('UserInfo')
############################################################

从UserGroup表操作,有user_info多对多
user_info_obj = models.UserInfo.objects.get(name=u'feng')
group_obj = models.UserGroup.objects.get(caption='CFO')

group_obj.user_info.add(user_info_obj)     # 添加数据
group_obj.user_info.remove(user_info_obj)  # 删除数据


user_info_objs = models.UserInfo.objects.all()
group_objs = models.UserGroup.objects.all()

group_obj.user_info.add(*user_info_objs)     # 添加数据
group_obj.user_info.remove(*user_info_objs)

#########################################

从UserInfo表操作
# 添加数据
#user_info_obj.usergroup_set.add(group_obj)
#user_info_obj.usergroup_set.add(*group_objs)

 

# 删除数据
#user_info_obj.usergroup_set.remove(group_obj)
#user_info_obj.usergroup_set.remove(*group_objs)

 
# 获取数据
#print group_obj.user_info.all()
#print group_obj.user_info.all().filter(id=1)

# 获取数据
#print user_info_obj.usergroup_set.all()
#print user_info_obj.usergroup_set.all().filter(caption='CEO')
#print user_info_obj.usergroup_set.all().filter(caption='DBA')    
原文地址:https://www.cnblogs.com/fengjian2016/p/5377234.html