django一对多,多对多操作

时间:2021-04-20 11:58:24
先在models中创建表,以及建立各表之间的关系:
class Publisher(models.Model):
    name = models.CharField(max_length=32)

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5,decimal_places=2)    # 999.99
    publisher = models.ForeignKey('Publisher',null=True ,related_name='books', related_query_name='book',on_delete=models.CASCADE)

class Author(models.Model):
    name = models.CharField(max_length=32)
    books = models.ManyToManyField('Book',related_name='authors')
表示一对多的关系:
# 基于对象
# 
# 正向查询     book ——》  publisher
# 
# book_obj.publisher     ——》    所关联的出版社对象
# book_obj.publisher.name     ——》    所关联的出版社对象名称
# book_obj.publisher.pk    ——》    所关联的出版社对象主键
# book_obj.publisher_id     ——》    从book中直接拿到所关联对象的id
#
# 反向查询    publisher ——》 book
# 
# 不指定related_name
# pub_obj.book_set      ——》   关系管理对象
# pub_obj.book_set.all()      ——》 出版社出版所有的书籍对象

# 指定related_name='books'
# pub_obj.books      ——》   关系管理对象
# pub_obj.books.all()      ——》 出版社出版所有的书籍对象
# 
# 基于字段查询
# 
# models.Book.objects.filter(publisher__name='人民出版社')
# 
# 不指定related_name
# models.Publisher.objects.filter(book__name='跟金老板学开车')

# 指定related_name =’books‘
# models.Publisher.objects.filter(books__name='跟金老板学开车')
# 指定related_query_name =’book‘
# models.Publisher.objects.filter(book__name='跟金老板学开车')
 
表示多对多的关系:
 
# 基于对象的查询
# author_obj.books      ——》   关系管理对象
# author_obj.books.all()      ——》   关系管理对象
# 
# 不指定related_name 
# book_obj.author_set      ——》   关系管理对象
# book_obj.author_set.all()      ——》 作者写过所有的书籍对象 
# 
# 指定related_name='authors' 
# book_obj.authors——》   关系管理对象
# book_obj.authors.all()      ——》 作者写过所有的书籍对象 
# 
# 管理对象的方法
#
# all       获取所有的对象
# set     设置关系      多对多 [ id,id  ]   [对象,对象]      一对多     [对象] 
# add     添加关系     多对多 id,id     对象,对象     一对多     对象 
# remove   删除关系        一对多:必须设置外键可为空,才有remove  clear方法
# clear       清空所有的关系
# create     创建一个对象并且添加关系