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