【问题标题】:Use data in foreign key model prior to saving in Django admin在保存到 Django admin 之前使用外键模型中的数据
【发布时间】:2019-06-20 19:45:05
【问题描述】:

我正在制作一个估算应用程序的原型。

每个 Estimate 模型将有一个或多个 Part 模型。

这是我的模型的开始:

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

我的 Estimate 模型出现在管理员中,而 Part 模型位于 StackedInline 中。

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


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

理想情况下,我会进入管理员,创建一个新的 Estimate,填写其部分,然后单击保存。

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

我无法弄清楚如何在保存之前将数据从 Part 模型发送到 Estimate 模型。

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

【问题讨论】:

  • 您确定需要在估价中保存价格吗?当您需要显示它时(通过注释相关零件价格的总和)很容易计算出来。
  • @DanielRoseman 嗯....我并没有真正想过只显示总价,但这可能会奏效。最终,我希望能够导出包含所有数据的 PDF,因此我认为我需要存储总价,但可能并非如此。

标签: django django-models django-admin


【解决方案1】:

据我了解,您可以使用 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 之前通过覆盖EstimateAdminsave_formset 保存功能:

class EstimateAdmin(admin.ModelAdmin):
    ....
    def save_formset(self, request, form, formset, change):
        formset.save() # this saves your parts
        form.instance.save() # this saves the Estimate

【讨论】:

  • 这是否假设零件已经保存在数据库中?创建估算时,它们将被输入到管理员中。
  • 不,首先创建父 e.x Estimate,然后创建 Part 对象。
  • 您是否将此添加到signals.py 文件中?它还需要什么才能工作?
  • 没关系。我把它放在 models.py 文件本身中。我知道这是不推荐的,但我无法让它以任何其他方式工作。
  • 啊。这在初始保存 Estimate 和 Part 时不起作用。我假设这是因为这些部件还没有在数据库中,所以parts = instance.part_set.all() 没有提取任何东西,因为在预保存时什么都没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-29
  • 2018-01-17
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多