Модели Django переопределяют сохранение и новое значение поля из связанных объектов

У меня есть такие модели Django:

class Car(models.Model):
    rating = models.PositiveIntegerField(
        default=0,
        verbose_name=_('Rating'),
    )

class ReportInfo(models.Model):
    car = models.ForeignKey(
        Car,
        related_name='car_info',
        verbose_name='Report',
    )

И мне нужно сформировать рейтинг для моих экземпляров автомобиля, включая информацию из отчетов, таким образом:

def save(self, *args, **kwargs):
    rating = 0
    for item in self.car_info.all():
        rating += 10
    self.rating = rating
    super(Car, self).save(*args, **kwargs)

Итак, мне нужно получить все отчеты о моей машине, затем получить некоторые другие данные из отчета и затем сохранить рейтинг в поле. Но, self.car_info.all() возвращает мне старые данные. Это означает следующее: когда я нажимаю кнопку "Сохранить" на странице администратора нового автомобиля, мой код в методе сохранения не имеет доступа к реальным отчетам, поскольку они еще не созданы.

Вы понимаете? Что я могу сделать?

2 ответа

Отразить заказ с помощью ModelAdmin звонки save_model() а также save_related(), Таким образом, из Model.save() Вы сможете получить обновленные значения соответствующих полей, как указано в этом посте.

class Car(models.Model):
    ...

    def save(self, *args, **kwargs):
        if not self.id:
            super().save(*args, **kwargs)
        rating = 0
        for item in self.car_info.all():
            rating += 10
        self.rating = rating
        super(Car, self).save(*args, **kwargs)


class CarAdmin(admin.ModelAdmin):

    def save_model(self, request, obj, form, change):
        if not obj.pk: 
            super().save_model(request, obj, form, change)
        else:
            pass 

    def save_related(self, request, form, formsets, change):
        form.save_m2m()
        for formset in formsets:
            self.save_formset(request, form, formset, change=change)
        super().save_model(request, form.instance, form, change)

Сейчас, self.car_info.all() вернет обновленные данные.

Проблема здесь заключается в порядке сохранения в Django.

Подобный вопрос уже задавали и отвечали.

Вы можете просто переопределить save_formset для своего сайта администратора, как показано в ссылке.

Другие вопросы по тегам