在保存到Django admin中之前,请使用外键模型中的数据

时间:2019-01-27 18:08:02

标签: django django-models django-admin

我正在估算应用程序的原型。

每个评估模型将具有一个或多个零件模型。

这是我的模特的开始:

class Part(models.Model):
    estimate = models.ForeignKey('Estimate', on_delete=models.CASCADE)
    description = models.CharField(max_length=255)


class Estimate(models.Model):
    number = models.CharField(max_length=255, primary_key=True)
    customer = models.CharField(max_length=255, null=True, blank=True)
    description = models.CharField(max_length=255, null=True, blank=True)
    price = models.IntegerField(null=True, blank=True)
    stitch = models.BooleanField(null=True, blank=True)
    stitch_speed = models.IntegerField(null=True, blank=True)
    stitch_rate = models.IntegerField(null=True, blank=True)
    boxes = models.IntegerField(null=True, blank=True)
    freight = models.IntegerField(null=True, blank=True)
    overall_markup = models.IntegerField(null=True, blank=True)
    date_created = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.number

我在管理员中出现了估算模型,在StackedInline中显示了零件模型。

class PartInline(admin.StackedInline):
    model = Part
    extra = 1


class EstimateAdmin(admin.ModelAdmin):
    model = Estimate
    inlines = [PartInline]
    list_display = ['number', 'description', 'customer', 'price']

理想情况下,我将进入管理员帐户,创建一个新的估算值,填写其零件,然后单击“保存”。

最终,我的评估模型将需要使用零件模型中的数据来执行计算,然后再保存到数据库中。例如,每个零件将包含其自己的价格。每个零件的价格都需要加到估算总价中。

在保存之前,我很难弄清楚如何将数据从零件模型发送到估算模型。

有什么建议吗?保存之前有没有在模型之间传递数据的标准方法?

1 个答案:

答案 0 :(得分:0)

据我了解,您可以使用 pre_save 信号,在这里您可以将所有零件与您的Estimate实例相关联。像这样:

from django.dispatch import receiver
from django.db.models.signals import pre_save
from somewhere import Estimate

@receiver(pre_save, sender=Estimate)
def pre_save_handler(sender, instance, **kwargs):
    # instance is your Estimate object that you currently save
    # you can get all part objects with:
    parts = instance.part_set.all() # a QuerySet list with your parts
    for part in parts:
        # do something with each part

编辑:为了使用_set函数获取所有组件,您必须反转逻辑,以便Part实例通过覆盖{{保存在Estimate之前1}}的{​​{1}}函数:

EstimateAdmin