【问题标题】:Inner join from two not directly related models in Django来自 Django 中两个不直接相关的模型的内部连接
【发布时间】:2011-09-29 19:42:26
【问题描述】:

假设我有这样的模型(为清楚起见,删除了所有不相关的字段):

A(Model):
   someFields = ... #irrelevant in this case

B(Model):
   a = ForeignKey(A)
   my_data = ... #the data I need to retrieve

C(Model):
   user = ForeingKey(User)
   a = ForeignKey(A)
   class Meta:
      unique_together = ('user', 'a')

现在,我如何使用 Django 查询获得与此 SQL 等效的内容:

SELECT my_data FROM B WHERE B.a_id = C.a_id AND C.user = %user%

【问题讨论】:

    标签: python sql django django-models inner-join


    【解决方案1】:

    幸运的是,您的查询使用了现有关系。

    B.objects.filter(a__c__user=someuser).distinct().values('my_data')
    

    【讨论】:

    • 谢谢,不知道a__c会自动出现
    • 其实我刚刚检查过,它会生成类似SELECT my_data FROM B INNER JOIN A on B.a_id = A.id INNER JOIN C ON A.id = C.a_id WHERE user = someuser 的SQL,这使得对表A 进行不必要的索引扫描。
    • 这就是 Django 的工作原理。如果您想做得更好,则需要使用原始查询。
    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多