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