我有一个仅存在 的模型来组合许多其他模型。有一系列“应付款”对象,需要将它们汇总为一个“付款”对象,称为“ 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()似乎是一个糟糕的计划;)