【问题标题】:Implementing Django ForeignKey-like subqueries without ForeignKey在没有 ForeignKey 的情况下实现类似 Django ForeignKey 的子查询
【发布时间】: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


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-01
      • 2017-01-17
      • 1970-01-01
      • 2018-11-23
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多