先在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 创建一个对象并且添加关系