【问题标题】:Django - how to automatically create a new model instance when another model instance is createdDjango - 如何在创建另一个模型实例时自动创建一个新的模型实例
【发布时间】:2023-02-11 14:03:14
【问题描述】:

我有一个OrderNotification模型,每当有新订单模型实例时,我想立即为新订单创建一个通知,我在模型中写了一些函数但是当有新订单时,通知实例不会被创建。我仍然认为应该有更好的方法来做到这一点,我该怎么做呢?

模型.py


class Orders(models.Model):
    service = models.ForeignKey(Service, on_delete=models.SET_NULL, null=True, related_name="service_orders")
    seller = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="seller")

    def create_notification(self):
        create_notification = Notification.objects.create(provider=self.seller, service=self.service, order=self , notification_type='new_order')
        create_notification.save()
        return create_notification



class Notification(models.Model):
    provider = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="provider_notifications")
    service = models.ForeignKey(Service, on_delete=models.SET_NULL, null=True, related_name="service_notifications")
    order = models.ForeignKey(Orders, on_delete=models.SET_NULL, null=True, related_name="service_order")
    notification_type = models.CharField(max_length=100, choices=NOTIFICATION_TYPE, default="none")

【问题讨论】:

  • 你在哪里调用create_notification函数?

标签: django django-models django-rest-framework


【解决方案1】:

您需要执行以下操作:

class Orders(models.Model):
    service = models.ForeignKey(Service, on_delete=models.SET_NULL, null=True, related_name="service_orders")
    seller = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="seller")

    def create_notification(self):
        create_notification = Notification.objects.create(
            provider=self.seller, service=self.service, order=self , notification_type='new_order')
        create_notification.save()
        return create_notification

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        super().save(force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)
        self.create_notification()

save方法将被覆盖,一旦你将它持久化在数据库层中,你就可以安全地调用方法create_notification

实现它的最佳方法可能是使用信号将逻辑与模型分离,并在单独的业务逻辑组件中对其进行管理,但如果您不介意应用最佳实践,那么最好采用该解决方案。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多