加入没有外键关系的其他 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>
)
也就是说,如果 ModelB
和 ModelC
的 some_id
总是引用 ModelA
的 some_id
,那么最好是使用 ForeignKey
[Django-doc] 因为这保证了参照完整性,并且使使用 ORM 更加方便。
我有一个 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>
)
也就是说,如果 ModelB
和 ModelC
的 some_id
总是引用 ModelA
的 some_id
,那么最好是使用 ForeignKey
[Django-doc] 因为这保证了参照完整性,并且使使用 ORM 更加方便。