【问题标题】:Django models override save and new field value from related objectsDjango 模型覆盖相关对象的保存和新字段值
【发布时间】:2017-07-22 07:57:13
【问题描述】:

我有这样的 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() 向我返回旧数据。这意味着下一步:当我单击新车管理页面中的保存按钮时,我在保存方法中的代码无法访问真实报告,因为它们尚未创建。

你明白吗?我能做什么?

【问题讨论】:

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


【解决方案1】:

通过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() 将返回更新后的数据。

【讨论】:

    【解决方案2】:

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

    similar question 已被询问和回答。

    您可以简单地覆盖您的管理站点的 save_formset,如链接所示。

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2018-10-07
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 2021-10-19
      • 2013-12-10
      相关资源
      最近更新 更多