python - 加入没有外键关系的其他表
问题描述
我有一个带有“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()”吗?或一些数据库表达式
我无法更改模型/表以添加外键关系。
解决方案
您可以使用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_id
s ofModelB
和ModelC
总是引用 a some_id
of ModelA
,那么最好使用ForeignKey
[Django-doc],因为这保证了引用完整性,并使得使用 ORM 更方便。
推荐阅读
- jakarta-ee - 了解 EJB 架构和实现
- security - 修改默认的 SPRING_SECURITY_CONTEXT_KEY,导致 spring-session not 无法获取 security 的 PRINCIPAL_NAME
- excel - 将表单文本框值插入下一个空闲单元格
- intersystems-iris - 在运行时移动 IRIS 数据库?
- c - 通过反转简单的“哈希”函数查找原像
- r - R:R中大数据的优化
- c# - 在过滤/搜索 IQueryable 中动态修改的值后获取计数时发生 SQL 超时
- java - ORA-01882: 未找到时区错误不允许建立连接
- xcode - macOS 应用程序扩展(音频单元)是否默认占用键盘?
- amazon-web-services - AWS Drupal 无头 CMS