【问题标题】:Django. Save Model Method to different model姜戈。将模型方法保存到不同的模型
【发布时间】:2020-08-16 22:48:43
【问题描述】:

我有一个数据模型,我想将 amount 的值和 total_amount 方法的值保存到付款方式中,以便将付款记录保存到数据库中。

** 数据/models.py **

class Data(models.Model):
    """ Model of Data"""
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    document = models.FileField(upload_to='documents/%Y/%m/%d')
    uploaded_at = models.DateTimeField(auto_now_add=True)
    amount = models.DecimalField(default=0, max_digits=6, decimal_places=2,
                                 blank=True, null=True)

    def total_amount(self):
        return Data.objects.filter(user=self.user).aggregate(Sum('amount'))['amount__sum']


付款/models.py

class Payment(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()
    created = models.DateTimeField(auto_now=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)
    amount = models.DecimalField(default=0, max_digits=6, decimal_places=2,
                                 blank=True, null=True)

payments/views.py

def payment_create(request):
    user = request.user
    data = Data.objects.filter(user=user)
    if request.method == 'POST':
        form = PaymentCreateForm(request.POST)
        if form.is_valid():
            payment = form.save()

            return render(request,
                          'payments/created.html',
                          {'payment': payment})
    else:
        form = PaymentCreateForm()
        # template and context
        template = 'payments/create.html'
        context = {'form': form,
                   'data': data
                   }
    return render(request,
                  template,
                  context
                  )

【问题讨论】:

  • 我编辑问题并将views.py。我想让数据模型金额也保存到付款方式金额。

标签: python django orm model


【解决方案1】:

信号是实现此类目标的不错选择。使用post_save 信号,您可以在创建新的Data 时调用函数,并且可以在那里创建Payment 实例:

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Data)
def create_payment(sender, instance, created, **kwargs):
    if created:
        # instance points to the new Data object created
        Payment.objects.create(amount=instance.total_amount()) # and any extra data you need

【讨论】:

  • 谢谢,差不多可以解决我的问题了。但我想要的是当用户填写付款表格时,data.total_amount 中的总金额将自动保存到付款金额。
  • 您的意思是amount 字段用于Data 模型或amount 字段用于Payment 模型?你可以在信号中做到这两点。为另一个模型创建一个新实例或使用instance.amount = instance.total_amount()然后instance.save()更新同一个实例并不重要
猜你喜欢
  • 2011-05-15
  • 2016-06-09
  • 2011-07-22
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多