我有一个类型为Foo
的对象,该对象的外键为Bar
。 Bar
有一个名为slug
的属性。
我能做
myfoo.bar = Bar.objects.get(slug='123')
但这会增加一个额外的查询。可以让Django在更新中将分配作为子查询生成吗?
即生成类似于以下内容的SQL:
UPDATE myfoo SET bar_id = (select id from bar where slug = '123')
答案 0 :(得分:1)
您可以使用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()