Django: `not F("is_show")` не работает должным образом

Я изучаю Django. Когда я использую F для изменения поля is_show, я могу только переключить True на False, но не могу переключить False на True

...

    @admin.action(description='switch show')
    def make_switch_show(modeladmin, request, queryset):

        # This code does not work properly, so I have to use `for`
        # Why this code cannot work like the following `for`
        # queryset.update(is_show=not F('is_show'))

        for it in queryset:
            it.is_show = False if it.is_show else True
            it.save()

    actions = [make_switch_show]

...

Некоторая информация об окружающей среде

django = "3.2.8"
Python 3.9.7
Database SQLite
Выражения

F не переносят значение поля из db в Python - они строят SQL-выражение для ссылки на поле в конечном запросе.

Причина, по которой он может переключать True на False, но не наоборот, заключается в том, что для Python выражение никогда не является ложным - оно всегда возвращает объект типа F. Поэтому not F('is_show') всегда False, потому что оно равно not bool(F('is_show')), а bool(F('is_show')) - True. not True является False

Я не думаю, что в настоящее время Django предоставляет прямой способ отрицания выражения F. Возможно, вам повезет с Case

Вернуться на верх