Модели 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 для своего сайта администратора, как показано в ссылке.