Django在__init__函数内的ORM查询中使用对象

时间:2019-01-22 22:47:01

标签: python django

我有一个仅存在 的模型来组合许多其他模型。有一系列“应付款”对象,需要将它们汇总为一个“付款”对象,称为“ ClubbedPayment”。

为模型提供了应付款对象的列表,并使用它们来计算各种属性。到目前为止,这工作正常。这些应付对象具有ClubbedPayment的外键。与其遍历应付对象并将新的ClubbedPayment对象作为外键添加到它们中,不如将它们添加到ClubbedPayment.payable_set()似乎更容易。我尝试这样做,但是失败了,因为在__init__函数中,ClubbedPayment对象尚未保存:

class ClubbedPayment(models.Model):
    recipient = models.ForeignKey(User, on_delete=models.PROTECT)
    paid_at = models.DateTimeField(null=True)
    is_unpaid = models.BooleanField(default=True)
    total = models.DecimalField(max_digits=6, decimal_places=2)
    payment_id = models.UUIDField(null=True, editable=False)
    response = models.CharField(null=True, max_length=140)
    payment_type = models.CharField(max_length=2, choices=PAYMENT_TYPES)

    def __init__(self, *args, **kwargs):
        super().__init__()
        objects = kwargs["objects"]
        recipients = set([x.recipient for x in objects])
        types = set([type(x) for x in objects])
        if len(recipients) > 1:
            raise Exception("Cannot club payments to more than one recipient")

        self.total = sum([x.total for x in objects])
        self.recipient = list(recipients)[0]

        for x in objects:
            self.payable_set.add(x)

现在,我知道,用非可选参数覆盖__init__被认为是狡猾的,因为它会阻止在其他地方保存,但这不是问题,因为在创建或修改这些对象的整个代码库。

问题是,我该如何解决?从__init__函数中调用save()似乎是一个糟糕的计划;)

0 个答案:

没有答案