Django save_form()用内联计算

时间:2011-04-14 15:26:58

标签: django

我有这样的设置:

models.py

class BargainItem(models.Model):
    product = models.ForeignKey(Item)
    bargain = models.ForeignKey(Bargain)
    quantity = models.IntegerField()

class Bargain(models.Model):
    name = models.CharField(max_length=50, unique=True)
    discount_price = models.DecimalField(decimal_places=2)
    total_price = models.DecimalField(decimal_places=2, editable=False, default=Decimal(0))

class Item(models.Model):
    name = models.CharField(max_length=50)
    price = models.DecimalField(decimal_places=2)

admin.py

class BargainItemInline(admin.TabularInline):
    model = BargainItem
    extra = 1

class BargainAdmin(admin.ModelAdmin):
    model = Bargain
    # ...
    inlines = (BargainItemInline,)

    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)
        for instance in instances:
            if isinstance(instance, Bargain):
                # ...
                instance.save()

以某种方式将total_price更新为Bargain对象 total_price =(instance.quantity * instance.product.price) - 折扣

我想在保存bargainItems之后更新讨价还价的total_price但是在写入数据库之前......我很困惑

2 个答案:

答案 0 :(得分:0)

我认为在这种情况下,您将不得不使用自定义信号在保存交易后更新字段。在Bargain对象上使用post_save将不起作用,因为如果你在post_save信号中保存Bargain对象,你将进入一个无限循环。

覆盖BargainAdmin的save_model方法将不起作用,因为直到保存了Bargain之后才会保存内联模型。

希望能让你朝着正确的方向前进。

答案 1 :(得分:0)

这适用于mysql,但是在sqlite3上我得到一个不存在,它实例返回一个空列表...... ??

    def save_formset(self, request, form, formset, change):
      #instances = formset.save(commit=False)
      #bargain_id = 0
      total_price = Decimal(0)
      print("Formset: ", formset)
      instances = formset.save(commit=False)
      print("Instances: ", instances)
      bargain_id = 0

      for instance in iter(instances):
          if isinstance(instance, BargainProduct):
              total_price += instance.quantity * instance.product.price
              bargain_id = instance.id
          instance.save()
      updateTotal = Bargain.objects.get(id=bargain_id)
      updateTotal.total_price = total_price - updateTotal.discount_price
      updateTotal.save()