Django:创建或更新对象后执行操作

问题描述 投票:0回答:1

我有一个名为 EventMembership 的模型,它确定某人是否参加活动:-

class EventMembership(models.Model):
    user = models.ForeignKey(User, related_name='eventmemberships')
    is_attending = models.BooleanField()

我还有一个 EventFee 模型,用于跟踪用户的事件费用:-

class EventFee(models.Model):
    user = models.ForeignKey(User, related_name='eventfees')
    amount = models.DecimalField()

如果用户参加活动,他们应该按照该活动的价格付费。如果没有,他们不应该收取费用。

我处理这些费用的创建、更新或删除的最佳方式是什么?

我看到很多人警告不要使用信号,我过去也遇到过信号问题,但它们似乎是完美的解决方案。

我想它是信号或覆盖模型上的 save() 方法,不是吗?但重写 save() 方法意味着每次保存模型时费用都会更新,这对我来说似乎很糟糕。

还有其他建议吗?

注意:我为此使用 Django Rest Framework,因此可以通过该框架创建、更新或删除这些 EventMembership。但它们也可以通过其他几种机制进行更新,例如用户删除他们的帐户 - 他们未来活动的所有会员资格将被设置为“不参加”,所以我不确定我应该支付费用在序列化器或视图中创建等。

django django-models django-rest-framework
1个回答
0
投票

1- 我发现 EventFee 模型中缺少一个字段。根据您的描述,除非有附加的 EventMembership,否则 EventFee 将不存在。所以我期望那里有一个外键(可能会替换用户)。

class EventFee(models.Model):
    membership = models.ForeignKey(EventMembership, related_name='eventfees', on_delete=models.CASCADE)
    amount = models.DecimalField()

添加

on_delete=models.CASCADE
将确保删除会员资格时费用也被删除。

2- 费用的更新和创建可以通过覆盖创建/更新方法简单地集中在 EventMembershipSerializer 中。如果您想避免信号,这可能更容易维护。

© www.soinside.com 2019 - 2024. All rights reserved.