Django's Admin list_display не будет показывать правильный значок Boolean при использовании сигнала pre_save или в пользовательском save() модели, если не сохранять модель дважды
У меня есть модель Product, и в models.py я использую сигнал pre_save для обновления поля all_variations_active продукта. По неизвестным причинам это поле all_variations_active не будет обновлено правильным булевым значением в list_display для администратора, пока продукт не будет сохранен дважды. Ниже приведен пример кода, с которым у меня возникли проблемы:
pre_save signal part in models.py:
@receiver(models.signals.pre_save, sender=Product, dispatch_uid='product_pre_save_unique_id')
def product_pre_save(sender, instance, **kwargs):
res = Variation.objects.filter(product=instance)
active_list = []
for i in res:
active_list.append(i.is_active)
if sum(active_list) < 1 or False in active_list:
instance.all_variations_active = False
else:
instance.all_variations_active = True
В файле admin.py:
class VariationInline(admin.TabularInline):
model = Variation
extra = 3
class ProductAdmin(admin.ModelAdmin):
list_display = (
'thumbnail', 'product_name', 'product_description', 'on_sale', 'price', 'stock', 'is_available', 'category',
'created_date', 'sku', 'all_variations_active')
inlines = [VariationInline, ]
Дополнительная информация: Модель Variation(models.Model) имеет модель продукта в качестве Foreignkey. Что выглядит следующим образом:
product = models.ForeignKey(Product, on_delete=models.CASCADE)
Суть в том, что когда я перехожу на вкладку вариаций товара и меняю флажки выбора - при сохранении вкладка сохраняется правильно, но в админке в list_display не отображается правильный булев статус вариаций - потому что согласно моему коду выше, если одна из вариаций товара False - all_variations_active в list_display должен показывать красный знак стоп с x меткой как false, и если все вариации отмечены флажками, то list_display в admin должен показывать зеленую галочку, а если ни один флажок не отмечен - list_display в admin должен показывать красный знак стоп с x-меткой как false - но в моем случае сохранение продукта один раз не изменит значок boolean list_display - и только после сохранения продукта дважды, правильный значок boolean будет отображаться правильно - то есть правильный значок false или зеленая галочка. Кто-нибудь знает, что происходит? Кстати, если я не использую сигнал pre_save и модифицирую код pre_save, чтобы он работал непосредственно в пользовательском save() Продукта, то он ведет себя точно так же, как и в части сигнала pre_save. Это что-нибудь подтверждает?