Django模型覆盖相关对象的保存和新字段值

时间:2017-03-02 14:24:27

标签: python django django-models django-admin django-signals

我有这样的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 个答案:

答案 0 :(得分:2)

这里的问题是Django的保存顺序。

similar question已被询问并回答。

您可以直接覆盖管理网站的save_formset,如链接所示。

答案 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()将返回更新的数据。