通过子查询设置一个django对象属性

Set a django object property through a subquery

我有一个 Foo 类型的对象,外键指向 BarBar 有一个名为 slug 的 属性。

我能做到

myfoo.bar = Bar.objects.get(slug='123')

但这会增加一个额外的查询。是否可以让 Django 在更新中将分配生成为子查询?

即生成 SQL 类似于:

UPDATE myfoo SET bar_id = (select id from bar where slug = '123')

您可以使用 Django Subquery 表达式:

from django.db.models import Subquery

# create the "SELECT id FROM bar WHERE slug = '123' LIMIT 1" subquery
subquery = Bar.objects.filter(slug='123')[:1]
# update only the correct foo object with this subquery
Foo.objects.filter(pk=myfoo.pk).update(bar=Subquery(subquery))
# refresh the variable so that `myfoo.bar` is correct
myfoo.refresh_from_db()