我有这样的设置:
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但是在写入数据库之前......我很困惑
答案 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()