【发布时间】:2021-06-15 16:13:41
【问题描述】:
我有一个基本模型:
class MyModel(Model):
id = models.IntegerField()
is_admin = models.BooleanField()
我想要实现的是根据id 值是否在某个值列表中,一次更新整个表的is_admin 字段的值。
基本上,在原始 SQL 中,这是我想要的查询:
UPDATE my_model
SET is_admin = (id IN (1, 2, 3, 4))
如何使用 Django 的 ORM 实现这一点?
这是我迄今为止尝试过的:
from django.db.models import F, Value
admin_ids = (1, 2, 3, 4)
MyModel.objects.update(is_admin=F("id") in admin_ids)
# Resulting query is:
# UPDATE my_model SET is_admin = false
MyModel.objects.update(is_admin=F("id") in Value(admin_ids))
# TypeError: argument of type 'Value' is not iterable
MyModel.objects.filter(id__in=admin_ids).update(admin=True)
MyModel.objects.exclude(id__in=admin_ids).update(admin=False)
# it works... but can I do this in a single query instead of two?
我正在使用 Django 3.2 和 PostgreSQL。
【问题讨论】:
标签: python django django-orm