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])

浙公网安备 33010602011771号