我有这样的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()
会将旧数据返回给我。这意味着下一步:当我点击新车的管理页面中的保存按钮时,我在保存方法中的代码无法访问真实报告,因为它们尚未创建。
答案 0 :(得分:2)
答案 1 :(得分:2)
使用ModelAdmin
来电save_model()
和save_related()
来翻转订单。这样,从Model.save()
开始,您就可以按照in this post所述达到相关字段的更新值。
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()
将返回更新的数据。