通过子查询设置Django对象属性

时间:2018-11-14 06:27:33

标签: django django-orm

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

我能做

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

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

即生成类似于以下内容的SQL:

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

1 个答案:

答案 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()