Django与select_related的反向关系

时间:2011-11-11 16:19:26

标签: sql django orm

我有4个模型,我想检索它们之间的连接

MODELA

class ModelA(models.Model):
    product = models.ForeignKey(ModelB)
    group = models.ForeignKey(Group)

ModelB

class ModelB(models.Model):
    title = models.CharField()

ModelC

class ModelC(models.Model):
    product = models.ForeignKey(ModelB)
    group = models.ForeignKey(ModelD)

ModelD

class ModelD(models.Model):
    name = models.CharField()

现在我希望所有 ModelA 对象与 ModelB ModelC ModelD 相结合 在sql中,这很容易做到。只需在表之间建立联接。 随着Django ORM我被卡住了,因为我只能做前进的关系。

我正在做这个

ModelA.objects.all().select_related(product)

但我无法加入ModelC 我已经阅读了this article,但我不想在我的大清单上循环,做一件简单的事情!我想只打一次数据库。

我正在使用Django的最后一个版本,我希望已经有一个解决方案,我不知道。

谢谢。

2 个答案:

答案 0 :(得分:8)

请参阅prefetch_related上的文档。这只是目前的开发,但会受到Django 1.4的影响。如果你可以等,或者你可以在行李箱上运行。你将能够使用它。

与此同时,您可以尝试django-batch-select。它基本上起到了同样的作用。

答案 1 :(得分:3)

编辑:重新阅读问题后,解决方案就不那么简单了。

docs说:

  

select_related仅限于单值关系 - 外键   和一对一。

Django 1.4查询集将具有prefetch_related方法,您一定要阅读。听起来你无法在一个查询中完成它,但是你可以在2或3中完成它。你应该看一看,如果你确实需要的话,升级到dev版本。< / p>

如果你不能使用开发版并且不能等待1.4,那么django也支持custom SQL queries