【发布时间】:2018-08-23 23:26:06
【问题描述】:
我有一个来自外部系统的非 ForeignKey ID 作为我的加入密钥。我想使用此 ID 进行 Django ORM 样式查询。
我想要的查询是:
results = MyModel.objects.filter(level='M', children__name__contains='SOMETHING')
我的模型如下所示:
class MyModel(BaseModel):
LEVELS = (
('I', 'Instance'),
('M', 'Master'),
('J', 'Joined')
)
level = models.CharField(max_length=2, choices=LEVELS, default='I')
parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.SET_NULL )
master_id = models.CharField(max_length=200)
name = models.CharField(max_length=300, blank=True, null=True)
这适用于 parent 作为字段,但父节点对于 master_id 字段是多余的:master_id 指示哪些子节点属于哪个主节点。我想摆脱parent(主要是因为数据集相当大,导入数据时设置父ID需要很长时间)。
我正在寻找的 SQL 等价物是:
SELECT
DISTINCT( s_m.master_id )
FROM
mytable s_m JOIN
mytable s_i ON
s_i.level = 'I' and s_m.level='M' AND s_i.master_id == s_m.master_id
WHERE
s_i.name like '%SOMETHING%';
我相信有一种方法可以使用 Manager 或 QuerySet 在 Django ORM 框架中启用对子项(在本例中为子项名称)的干净查询,但我不知道如何。任何指针将不胜感激。
【问题讨论】:
标签: django django-models