我在admin.py
中为课程写了一个动作 if($role == "")
{
$form->setError("role",$role);
}
我希望此操作能够改变产品的状态。
我的尝试是:
它有效,但我认为这需要大量资源。 如果有人有想法优化它?
答案 0 :(得分:1)
自Django 1.8起,支持Conditional Expressions(SQL
' s Case..When..
)。
因此,以下django ORM单一更新语句应该完成您需要的内容
from django.db.models import Case, When, F, Q, BooleanField, Value
queryset.annotate(new_value=Case(
When(Q(stockable=False), then=Value(True)),
default=Value(False),
output_field=BooleanField()
)).update(stockable=F('new_value'))
它生成以下sql
UPDATE `yourmodel`
SET `stockable` = CASE WHEN `yourmodel`.`stocakble` = 0 THEN 1 ELSE 0 END
WHERE <queryset's filters>
记录中,这是我最初提出的原始错误解决方案
您只需发出两个更新而不是循环:
queryset.filter(stockable=False).update(stockable=True)
queryset.filter(stockable=True).update(stockable=False)
这将用两个更新语句翻转标志
答案 1 :(得分:0)
您可以尝试使用批量更新,它会针对一堆记录触发单个查询,而不是每个记录一个查询。
def make_stockable_unstockable(self, queryset):
queryset.filter(stockable=False).update(stockable=True)
queryset.filter(stockable=True).update(stockable=False)