经典的例子:一本书有多个作者,一个作者有多本书,典型的多对多关系。
设计模型如下:
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. ATG2. dragon3. OA4. 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')