Django_基于对象——跨表查询

一对多:

  如果有A表和B表,关联属性在那个表A中。

    正向查询:A---->B

# 一对多的正向查询:查询三国演义这本书的出版社的名字
book_obj = models.Book.objects.filter(title='三国演义').first()
print(book_obj.publish)     # 与这本书关联的出版社对象
print(book_obj.publish.name)    # 从出版社对象中获取出版社的名字

    反向查询:B---->A

# 一对多的反向查询:查询人民出版社出版过的书籍名称
publish_obj = models.Publish.objects.filter(name='人民出版社').first()
ret = publish_obj.book_set.all()  # 对象.表名_set.all()
print(ret)  # 查询到的书籍的对象
print(ret.values('title'))  # 拿出书籍对象中的title字段。

多对多:

  如果有A表和B表,关联属性在那个表A中。

    正向查询:A---->B

# 查询aaaaa的作者的名字
book_obj = models.Book.objects.filter(title="aaaaa").first()
author_list = book_obj.authors.all()  # 关联的所有作者的对象的集合。
print(author_list)  # 是一个列表
print(author_list[0].name, author_list[1].name)  # 从列表中拿出每一个对象,然后获取对象中的name字段

    反向查询:B---->A

# 查询主宰出版过的所有书籍的名称
author_obj = models.Author.objects.filter(name="主宰").first()
ret = author_obj.book_set.all()    # 作者对象.表明_set.set.all()
print(ret)  # 查询到的书籍对象
print(ret[0].title, ret[1].title)   # 从书籍对象能获取书籍的名称

一对一:

  如果有A表和B表,关联属性在那个表A中。

    正向查询:A---->B

# 查询作者女娲的地址信息
author_obj = models.Author.objects.filter(name="女娲").first()
ret = author_obj.authordetail   # 作者表对象.字段
print(ret)  # 详情信息对象
print(ret.addr)     # 从对象中获取地址信息

    反向查询:B---->A

# 查询地址为北京的作者名字
obj = models.AuthorDetail.objects.filter(addr="北京").first()
ret = obj.author    # 对象.表名
print(ret)  # 查询到的作者表对象
print(ret.name)     # 从对象中获取name字段

 

posted @ 2020-04-19 16:45  手可摘星辰。  阅读(195)  评论(0编辑  收藏  举报