加入没有外键关系的其他表

时间:2021-01-18 23:13:43

标签: python django postgresql inner-join

我有一个以“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

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

1 个答案:

答案 0 :(得分: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')))
)

话虽如此,如果 some_idModelBModelC 总是引用 some_idModelA,那么最好使用ForeignKey [Django-doc] 因为这保证了参照完整性,并使 ORM 的使用更加方便。