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

Join onto other table where there is no foreignkey relationship

我有一个 Django 模型以“some_id”和许多其他模型以“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

我无法更改 model/table 以添加外键关系。

可以Exists subquery [Django-doc]做到这一点:

from django.db.models import Exists, OuterRef

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

也就是说,如果 ModelBModelCsome_id 总是引用 ModelAsome_id,那么最好是使用 ForeignKey [Django-doc] 因为这保证了参照完整性,并且使使用 ORM 更加方便。