创建后Django设置模型字段

时间:2019-01-14 23:32:20

标签: python django django-models

我有一个Movie模型和一个DefaultMoviePriceFor模型,用于保存特定类型的默认价格:

class Movie(models.Model):
    name = models.TextField('name', null=True)
    genre = models.TextField('genre', null=True)
    price = models.IntegerField('price', default=0)

class DefaultMoviePriceForGenre(models.Model):
    genre = models.TextField('genre', null=True)
    price = models.IntegerField('price', default=0)

现在,我想在每次实例化Movie对象时,使用Movie.genre的默认价格填充Movie.price。

有什么好的方法吗?我脑子里有SQL触发器,他们可以做到,不是吗?如何在Django中完成?

1 个答案:

答案 0 :(得分:0)

一种实现方法是使用pre-save signal。这将在保存任何模型实例之前立即触发,并且会收到created布尔型arg,仅当对象是新的时,您才可以设置价格。

如果出于某种原因要在保存后执行此操作(例如EG),则还会有一个保存后的信号,因为您的行为取决于新实例的PK。但是预保存应该在这里起作用。

或者,您可以覆盖模型类的save方法。 https://docs.djangoproject.com/en/2.1/topics/db/models/#overriding-model-methods

有关此两种方法的优缺点的一些讨论,请参见以下答案:Django signals vs. overriding save method

所有这些都假设所需的行为与所描述的完全相同-创建实例时查找该类型的当前默认价格,并与将来对该类型的更改无关地保存该默认价格。如果您想做些更灵活的事情-例如,说“除非被覆盖,否则恐怖电影现在要花X钱,但是如果以后更改默认类型的价格,它们都应该全部更新”,那么最好使用Movie类上的方法它根据当前状态计算价格,而不是在创建和断开连接时进行设置。但这取决于您想要什么。