【问题标题】:Toggle boolean fields from a Queryset using 'not F()'使用“not F()”从查询集中切换布尔字段
【发布时间】:2021-11-21 07:49:53
【问题描述】:

我添加了一个新操作来切换用户is_staff 属性。但是我注意到使用下面的方法,只能从True切换到False。反过来似乎不起作用(即从FalseTrue)。

admin.py

from django.db.models.expressions import F

actions = ['toggle_staff']
def toggle_staff(self, request, queryset):
    queryset.update(is_staff= not F('is_staff'))

编辑

我使用迭代的解决方案是:

actions = ['toggle_staff']
def toggle_staff(self, request, queryset):
    for user in queryset:
        user.is_staff = not user.is_staff
        user.save()

但我不认为这是针对成千上万的用户进行优化的。拜托,我在这里需要帮助。

【问题讨论】:

    标签: python django django-admin django-queryset


    【解决方案1】:

    您始终可以遍历查询集,这可能不是最佳性能,但如果您一次只与几个用户打交道,您应该不会注意到差异:

    from django.db import transaction
    
    def toggle_staff(self, request, queryset):
        
        with transaction.atomic():
    
            for user in queryset:
                if user.is_staff: user.is_staff = False
                else: user.is_staff = True
                user.save()
    

    编辑:

    使用transactions.atomic 可以显着提高性能。

    【讨论】:

    • 谢谢@Daniel,我其实知道这种方法。例如,我想要针对数千次更新进行优化的东西。
    • 您可以使用transaction.atomic - 它会显着加快处理时间。查看我的更新。
    猜你喜欢
    • 2011-10-02
    • 2017-06-15
    • 1970-01-01
    • 2023-03-16
    • 2015-12-15
    • 2018-09-12
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多