在表单提交后更新另一个模型的对象

时间:2017-03-22 12:55:49

标签: django python-3.x django-models django-views django-queryset

我试图在表单提交后更新另一个模型的对象。我希望Savings模型中已存在的单个对象已更新,以反映最近的Entry提交。

流程:

填写并提交Entry表单后,我需要Savings对象,其中包含" total"字段,待更新。

Savings字段从Entry表单中获取数据,对其求和,然后将其发布到相应的字段。例如,Savings.total_spent_euros汇总Entry.euros_sumsSavings.total_spent_dollars汇总Entry.dollars_sum。这个逻辑不是问题。我遇到的问题是我现在必须在Savings中打开admin对象,并在每次希望对象包含最新条目时保存它。我想自动化。

models.py

    class Entry(models.Model):
        date = models.DateField(blank=True, null=True,)
        euros = models.CharField(max_length=500, blank=True, null=True)
        comments = models.CharField(max_length=900, blank=True, null=True)
        euros_sum = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
        xrate = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
        dollars_sum = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
        daily_savings_dollars = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
        daily_savings_display = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)

        def get_absolute_url(self):
            return reverse('argent:detail', kwargs={'pk': self.pk})

class Savings(models.Model):
        total_spent_euros = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
        total_spent_dollars = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
        total_savings = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
        total_savings_display = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)

我是否正确地假设我的命令必须在这两个视图中输入? (我可能错了):

views.py

class EntryCreate(CreateView):
    form_class = EntryForm
    template_name = 'argent/entry_form.html'

    def form_valid(self, form):
        Savings.objects.update(id=1)
        return super(EntryCreate, self).form_valid(form)


class EntryUpdate(UpdateView):
    model = Entry
    form_class = EntryForm
    template_name = 'argent/entry_form.html'

    def form_valid(self, form):
        Savings.objects.update(id=1)
        return super(EntryUpdate, self).form_valid(form)

但是,每当我使用Savings.objects.update(id=1)Savings.objects.filter(id=1).update()时,都不会发生任何事情。我在这里俯瞰什么?

提前感谢您的帮助!

编辑:添加了更多细节。

1 个答案:

答案 0 :(得分:1)

在nik-m的帮助下,我们终于想出了一个解决方案。这是我更新的views.py。我不仅需要使用.update解决方案,而且还必须包含我forms.py内所有其他逻辑。

<强> views.py

class EntryCreate(CreateView):
    form_class = EntryForm
    template_name = 'argent/entry_form.html'

    def form_valid(self, form):
        if form.save(self):
            # total_euros_spent
            sum_euros = Entry.objects.aggregate(s=Sum('euros_sum')).get('s')
            sum_euros_f = "{0:.2f}".format(sum_euros)

            # total_dollars_spent
            sum_dollars = Entry.objects.aggregate(s=Sum('dollars_sum')).get('s')
            sum_dollars_f = "{0:.2f}".format(sum_dollars)

            # total_sum
            sum_savings = Entry.objects.aggregate(s=Sum('daily_savings_dollars')).get('s')
            sum_format = "{0:.2f}".format(sum_savings)

            # total_sum_format
            sum_abs_savings = Entry.objects.aggregate(s=Sum('daily_savings_dollars')).get('s')
            absolute = abs(sum_abs_savings)
            sum_abs = "{0:.2f}".format(absolute)

            Savings.objects.filter(id=1).update(total_savings=sum_format, total_savings_display=sum_abs,
                                                total_dollars_spent=sum_dollars_f, total_euros_spent=sum_euros_f)

            return super(EntryCreate, self).form_valid(form)

        else:
            return self