带有静态 VALUES 表达式的 Django 子查询

问题描述 投票:0回答:1

是否可以使用 Django ORM 编写一个从一组固定值中进行选择的子查询?

SELECT
  id,
  name,
  (
    SELECT
    new_ages.age
    FROM
    (VALUES ('homer', 35), ('marge', 34)) AS new_ages(name, age)
    WHERE new_ages.name = ages.name
  ) AS new_age
FROM
  ages
  ;

此类查询的输出可能类似于:

person_id  name    age
        1  homer   35
       42  marge   34
       99  bart    null

我知道 Django 代码看起来像这样:

from django.db.models import OuterRef, Subquery
from my_app.models import Person

Person.objects.annotate(age=Subquery(...(name=OuterRef("name")))

但是

...
里面有什么?

python django
1个回答
0
投票

据我所知,你不能在 Django 中定义这样的“内存中”表,或者至少现在不能。

可悲的现实是,Django 的

.bulk_update(…)
实现[Django-doc](本质上就是您在这里所做的)也存在同样的问题。它以一种有点“笨拙”的方式解决了这个问题:一个长的
CASE … WHEN … THEN … END
序列。我们可以用同样的方式做到这一点:

new_ages = {'homer': 35, 'marge': 34}

Person.objects.annotate(
    age=Case(*[When(name=k, then=Value(v)) for k, v in new_ages.items()])
)

我写了一篇关于此的文章[django-antipatterns],但同样,这不是一个好方法。也许最好的方法甚至是定义一个模型,可以将项目转储到其中,然后让 JOIN 完成工作。

© www.soinside.com 2019 - 2024. All rights reserved.