来自 Django 中两个不直接相关的模型的内部连接

Posted

技术标签:

【中文标题】来自 Django 中两个不直接相关的模型的内部连接【英文标题】:Inner join from two not directly related models in 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%

【问题讨论】:

【参考方案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 的工作原理。如果您想做得更好,则需要使用原始查询。

以上是关于来自 Django 中两个不直接相关的模型的内部连接的主要内容,如果未能解决你的问题,请参考以下文章

如何为来自相关模型的聚合数据实现自定义 django 过滤器

Django 从相关模型中减去两个字段

两个相关模型的 Django 查询

Django:将来自外部 API 的数据映射到模型中?

Django外键未在模板中呈现相关模型数据

Django 相关模型无法解析