【问题标题】:Django and multiple joinsDjango 和多个连接
【发布时间】:2018-06-04 02:06:31
【问题描述】:

我正在尝试进行很长的连接,但 django 似乎无法处理最后一层。我弄错了还是有什么办法解决这个问题?

模型.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。但是,由于很多原因,这并不理想。

任何帮助将不胜感激。

亲切的问候, 彼得

【问题讨论】:

  • 发布您的确切错误回溯

标签: python django join orm


【解决方案1】:

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

它可以工作,而且效率很高,但是代码不是很干净。如果有人建议另一种方法来做到这一点,我会很高兴听到。

谢谢, 彼得

【讨论】:

    猜你喜欢
    • 2016-08-20
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多