在Admin Django中反之亦然

时间:2016-06-30 10:13:07

标签: django django-models django-admin

我在admin.py

中为课程写了一个动作
    if($role == "")
    {
        $form->setError("role",$role);
    }

我希望此操作能够改变产品的状态。

我的尝试是:

它有效,但我认为这需要大量资源。 如果有人有想法优化它?

2 个答案:

答案 0 :(得分:1)

自Django 1.8起,支持Conditional ExpressionsSQL' 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)