Django - 加入两个多对一关系

时间:2016-05-13 11:10:01

标签: django orm

我很难尝试编写Django ORM查询来获取以下查询的类似内容:

vendors = Vendors.objects.select_related('legal_entities') #....and then I want to also get legal_entities_details

我的模特:

  class LegalEntitiesDetails(models.Model):
        legal_entities = models.ForeignKey(LegalEntities, models.CASCADE)
    class LegalEntities(models.Model):
        #...Some fields
    class Vendors(models.Model):
        legal_entities = models.ForeignKey(LegalEntities, on_delete=models.CASCADE)

我无法通过select_related找出如何做到这一点。您看到的问题是我无法编写一个简单的链式selected_related,因为供应商和legal_entities_details都与legal_entities相关。请耐心等待这个问题,我是Django的新手。

2 个答案:

答案 0 :(得分:1)

你不能用select_related做到这一点,因为那只适用于前向关系,LegalEntities和LegalEntitiesDetails之间的联系是一种向后关系。您需要使用prefetch_related,它可以遵循向后关系,但使用两个查询来执行此操作。

答案 1 :(得分:1)

您是否尝试过相关预取?来自docs:

  

select_related通过创建SQL连接并在SELECT语句中包含相关对象的字段来工作。因此,select_related在同一数据库查询中获取相关对象。但是,为了避免加入“多”关系会产生更大的结果集,select_related仅限于单值关系 - 外键和一对一。

     另一方面,

prefetch_related对每个进行单独查找   关系,并在Python中“加入”。这允许它   预取多对多和多对一对象,这是无法完成的   使用select_related,除了外键和一对一   select_related支持的关系。   more here

如果你的关系没有在你预取的类中直接定义,你可以使用classname_set来产生反向关系

这样的事情应该有效:

Vendors.objects.select_related('legal_entities')
               .prefetch_related('legal_entities__legalentitiesdetails_set')