是否可以使用 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")))
但是
...
里面有什么?
据我所知,你不能在 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 完成工作。