【问题标题】:Join onto other table where there is no foreignkey relationship加入另一个没有外键关系的表
【发布时间】:2021-04-23 06:33:25
【问题描述】:

我有一个带有“some_id”的 Django 模型和许多其他带有“some_id”作为主键的模型。

class ModelA(models.Model):

    name = models.CharField(max_length=150)
    some_id = models.PositiveIntegerField()

    [...] # more fields


class ModelB(models.Model):
    some_id = models.PositiveIntegerField(primary_key=True)

    [...] # more fields



class ModelC(models.Model):
    some_id = models.PositiveIntegerField(primary_key=True)

    [...] # more fields

如果 ModelB/ModelC 等中存在行,我如何使用布尔字段注释 ModelA 查询集

------------------------------------------
| name     | some_id   | has_b   | has_c |
-----------------------------------------
| John     |    1      | True    | False |
------------------------------------------

我需要使用“.extra()”吗?或者一些数据库expression

我无法更改模型/表以添加外键关系。

【问题讨论】:

  • 请不要这样做。您可以在模型中将其设为 some_id = models.ForeignKey(ModelA, on_delete=models.CASCADE, primary_key=True),或者直接使用模型继承。

标签: python django postgresql inner-join


【解决方案1】:

可以使用Exists subquery [Django-doc]

from django.db.models import Exists, OuterRef

ModelA.objects.annotate(
    has_b=Exists(ModelB.objects.filter(some_id=OuterRef('some_id'))),
    has_c=Exists(ModelC.objects.filter(some_id=OuterRef('some_id')))
)

话虽如此,如果ModelBModelCsome_ids 总是引用ModelAsome_id,那么最好使用ForeignKey [Django-doc],因为这样可以保证引用完整性,并且使用 ORM 更方便。

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 2019-09-17
    • 2018-11-04
    • 2016-12-02
    • 2021-11-30
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多