Django和多个连接

时间:2017-12-21 11:42:03

标签: python django join orm

我试图做一个很长的连接,但似乎django无法处理最后一层。我弄错了还是有办法解决这个问题?

Models.py

class A(models.Model):
    object_id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=50)

class B(models.Model):
    class_A_object = models.ForeignKey(A, on_delete=models.PROTECT)
    value = models.CharField(max_length=50)

class C(models.Model):
    class_B_object = models.ForeignKey(B, on_delete=models.PROTECT)

class D(models.Model):
    value= models.IntegerField(primary_key=True)
    class_C_object = models.ForeignKey(C, on_delete=models.PROTECT)

然后我尝试在相关的A类对象名称= ABC时选择D类中的值。

D.objects.filter(class_C_object__class_B_object__class_A_object__name='ABC')

这失败了,从pycharm开始拒绝自动完成它,如果我运行它,我得到一个名称未定义错误。

但是,如果我放下一层就可以了。

D.objects.filter(class_C_object__class_B_object__value='ABC')

我还没有找到任何提及最大连接数的文档,但感觉这里有一个限制。

有没有人知道是否属实,如果有,那么解决这个问题的最佳方法是什么?

数据库在我外部,无法修改。我目前唯一有效的解决方法是直接使用游标并手动编写sql。然而,由于很多原因,这并不理想。

非常感谢任何帮助。

亲切的问候, 彼得

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题,也许不是最好的解决方案,但是通过获取A匹配名称ABC的查询集,然后使用该查询集在D上使用__in过滤器得到我想要的结果,它只是做一个查询。

它有效,并且效率很高,但代码不是很干净。如果有人建议采用另一种方法,我会很高兴听到。

谢谢, 彼得