在不使用ForeignKey

时间:2018-08-23 23:26:06

标签: django django-models

我有一个来自外部系统的非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框架中启用对子级(在本例中为子级名称)的干净查询,但我不知道如何做到。任何指针将不胜感激。

1 个答案:

答案 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()