多对多的操作
已知表的关系是:
models.py
class Publisher(models.Model): name = models.CharField(max_length=32) def __str__(self): return '<Publisher: {} - {}>'.format(self.pk, self.name) class Book(models.Model): title = models.CharField(max_length=32) publisher = models.ForeignKey('Publisher',related_name='books',related_query_name='book',on_delete=models.CASCADE) def __str__(self): return '<Book: {} - {}>'.format(self.pk, self.title) class Author(models.Model): name = models.CharField(max_length=32) books = models.ManyToManyField('Book') #多对多创建,后面是要关联的表Book类
>python manage.py makemigrations
>python manage.py migrate
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings") import django django.setup() from app01 import models author_obj = models.Author.objects.get(pk=1) # print(author_obj) # print(author_obj.name) # # print(author_obj.books,type(author_obj.books)) #关系管理对象 # print(author_obj.books.all()) #关联的所有对象 book_obj = models.Book.objects.get(pk=3) # print(book_obj) # print(book_obj.title) # print(book_obj.author_set.all()) # create # 通过作者对象创建书籍对象 app01_author_books 表自动加上了 # ret = author_obj.books.create(title='二狗的余孽',publisher_id=1) # print(ret) # add 添加关系 关联的对象或者id app01_author_books表 # ret = author_obj.books.add(1,2,3) #id # print(ret) # None 但是app01_author_books 表自动加上了 # ret = author_obj.books.add(*models.Book.objects.filter(id__in=[1, 2, 3])) # 写对象,[]的话使用*打散 # print(ret) #remove 删除关系 #外键的管理对象只能用对象 不能用id # author_obj.books.remove(*models.Book.objects.filter(id__in=[1, 2, 3])) #清空所有的关系 # author_obj.books.clear() #set重新设置所有的关系 # author_obj.books.set([1,2,3,4]) # author_obj.books.set([1,2]) #覆盖,重新做一遍设置
#补充:
1、想通过管理对象清除关系的时候报错,如何解决:
在字段加上null=True
2、通过外键做add remove那里面就不能填id了。那里面必须填对象。
总结:外键的管理对象只能用对象 不能用id
作者:wangkaiok —— 小菜鸟111
出处:http://www.cnblogs.com/wangkaiok/
本文版权归作者和博客园共有,但未经作者同意禁止转载,转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。