python-使用Django queryset访问不同的外键关系
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-使用Django queryset访问不同的外键关系,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1692字,纯文字阅读大概需要3分钟。
内容图文
![python-使用Django queryset访问不同的外键关系](/upload/InfoBanner/zyjiaocheng/686/97327ee1ea6e4db599476a955cb4d9d5.jpg)
给定基本的书籍/作者模型:
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('Author')
publisher = models.ForeignKey('Publisher')
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
可以说,我有一个非常复杂的查询来根据一堆参数选择书籍(我的实际模型比这些模型复杂得多).为了简化起见,对于这个示例,我的复杂查询将仅选择书名中带有单词“ the”的书:
q = Book.objects.filter(title__icontains="the")
有没有一种方法(除了循环或使用反向外键查找之外)来获取所有与此查询中的书链接的不同Author对象?例如.我尝试添加:
q = q.values('author').distinct()
但这只是返回author__id值.我正在尝试以这种方式进行操作,因为我的“复杂查询”非常耗时/耗费资源,并且我只想运行一次该查询(以获取书籍并分离出不同的作者列表).另外,通过django rest框架呈现数据集时,数据集也需要进行展平(书籍和作者的单独列表),而我的客户要求将数据集展平.例如.:
{
"books": [
{"id": 1, "title": "The Book.", "author": 1, "publisher": 1},
{"id": 2, "title": "The Other Book.", "author": 2, "publisher": 1},
{"id": 3, "title": "The Best Book.", "author": 1, "publisher": 1},
],
"authors": [
{"id": 1, "first_name": "Joe", "last_name": "Smith"},
{"id": 2, "first_name": "Gina", "last_name": "Randolph"}
]
}
或者,django rest框架是否有一种简单的方法来获取带有嵌套外键的复杂查询的结果并将其展平?
解决方法:
确实,吸引作者的最好方法是查询作者而不是书籍.您可以通过双下划线语法来遵循这种关系:
q = Author.objects.filter(book__title__icontains="the")
但是由于您说查询是密集型的,并且您希望只运行一次,所以另一种方法是使用select_related进行JOIN,然后手动处理结果以获取作者:
q = Book.objects.select_related('author').filter(title__icontains="the")
authors = set(book.author for book in q)
内容总结
以上是互联网集市为您收集整理的python-使用Django queryset访问不同的外键关系全部内容,希望文章能够帮你解决python-使用Django queryset访问不同的外键关系所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。