多对多的操作

已知表的关系是:

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

原文地址:https://www.cnblogs.com/wangkaiok/p/10492839.html