我有一个来自外部系统的非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框架中启用对子级(在本例中为子级名称)的干净查询,但我不知道如何做到。任何指针将不胜感激。
答案 0 :(得分:1)
您可以尝试这样的事情吗?
table1.objects.filter(master_id__in=table2.objects.filter(level='I').values_list(master_id,flat=True),level='M',name__contains='SOMETHING').values_list(master_id).distinct()