首页 > 解决方案 > 加入没有外键关系的其他表

问题描述

我有一个带有“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()”吗?或一些数据库表达式

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

标签: pythondjangopostgresqlinner-join

解决方案


可以使用Exists子查询 [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_ids ofModelBModelC总是引用 a some_idof ModelA,那么最好使用ForeignKey[Django-doc],因为这保证了引用完整性,并使得使用 ORM 更方便。


推荐阅读