10.Django多对多关系模型

定义:
vim blog/models.py
from django.db import models
class Author(models,Model):
name = models.CharField(max_length=30)

def __unicode__(self):
return self.name

class Book(models,Model):
name = models.CharField(max_length=30)
authors = models.ManyToManyField(Author)

def __unicode__(self):
return self.name


多对多指的是一个作者可以写多本书,1本书也可以被多个作者完成


python manage.py syncdb #同步一下数据库

 


命令界面实现:
检索:
many端
from blog.models import Author,Book #先把这两个类对象导进来
Author.objects.create(name='Alen') #添加作者,我们这里加了4个作者
Author.objects.create(name='Ben')
Author.objects.create(name='Carl')
Author.objects.create(name='Dev')
authors = Author.objects.all()


然后我们增加1本书并设置它的name属性,并保存
b1 = Book()
b1.name = 'python book1'
b1.save()
然后将其与authors相关联,先添加alen(通过get方法)
alen = Author.objects.get(name_exact='Alen')
b1.authors.add(alen)
再添加ben,carl,dev(通过下标索引方法)
b1.authors.add(authors[1])
b1.authors.add(authors[2])
b1.authors.add(authors[3])

这个时候我们去看下b1这本书的authors都有哪些
b1.authors.all()
或者通过过滤查询
b1.authors.filter(name__exact='Ben')

移除:
b1.authors.remove(alen)
b1.authors.remove(authors[2])

 


那么既然是多对多,可以为b1添加author,也可以为author添加book
以alen添加b1为例:
alen.book_set.all() #查看发现alen拥有0本书
alen.book_set.add(b1) #把b1对象添加到alen里
alen.book_set.create(name='python book2') #创建一本书的对象,名字叫做python book2
alen.book_set.all() #这个时候就发现alen写了两本书,python book1 和 python book2

移除:
books = alen.book_set.all()
alen.book_set.remove(books[0])

posted @ 2018-04-25 11:25  Paco_Pig  阅读(143)  评论(0)    收藏  举报