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