Django ListView 使用反向外键查找
如果我有如下的代码:
Person
Email
FK(Person)
Phone
FK(Person)
Address
FK(Person)
我想要显示一个列表,每个人的名字旁边都有他们的电话号码、电子邮件和地址。只要用到all()[0]就可以了,我该如何创建一个查询集(QuerySet)来传递给这个列表呢?
谢谢!
1 个回答
0
这些关系是一对一还是一对多呢?如果是一对一的话,你可以通过Django的聚合功能在一次查询中获取所有的引用(编辑:抱歉,实际上只能获取它们的主键)。比如:
from django.db.models import Min
Person.objects.all().annotate(email=Min('email'), phone=Min('phone'), address=Min('address'))
不过我不太确定这样是否能和ListView很好地结合... 也许使用OneToOneField会在这种情况下有效(即使不使用聚合),我不太确定。
如果关系是一对多的话,我担心你无法在一次查询中完成。正如你可能已经知道的,给定一个Person
对象,你可以通过_set
后缀来获取相关的模型,比如email_set
、phone_set
和address_set
。但是要访问这些数据,你需要进行其他查询(这会增加数据库的访问次数)。