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