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. Это что-нибудь подтверждает?

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