我有一个以“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
我无法更改模型/表以添加外键关系。
答案 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_id
和 ModelB
的 ModelC
总是引用 some_id
的 ModelA
,那么最好使用ForeignKey
[Django-doc] 因为这保证了参照完整性,并使 ORM 的使用更加方便。