Python Django在创建后设置模型字段
我有一部模型电影和一部模型DefaultMoviePrice,用于保存特定类型的默认价格:Python Django在创建后设置模型字段,python,django,django-models,Python,Django,Django Models,我有一部模型电影和一部模型DefaultMoviePrice,用于保存特定类型的默认价格: class Movie(models.Model): name = models.TextField('name', null=True) genre = models.TextField('genre', null=True) price = models.IntegerField('price', default=0) class DefaultMoviePriceForGe
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.genre的默认价格填充Movie.price
有什么好办法吗?我脑子里有SQL触发器,它们可以做到,不是吗?django是如何实现的?一种方法是使用。这将在保存模型的任何实例之前立即触发,并将收到一个创建的
布尔参数,该参数仅在对象是新对象时才允许您设置价格
如果出于某种原因,您希望在保存后执行此操作(例如,因为您的行为取决于新实例的PK),那么也会有一个post save信号。但是预保存应该在这里起作用
或者,可以重写模型类的save
方法
有关这两种方法的利弊讨论,请参见此答案:
这都是假设所需的行为与所描述的完全相同——在创建实例时查找类型的当前默认价格,并将其独立于类型的未来更改而保留。如果你想做一些更灵活的事情,比如说“恐怖电影现在成本为X,除非被覆盖,但是如果我以后更改默认类型的价格,它们应该都会更新”,你最好在电影
类上使用一个方法,该方法根据当前状态计算价格,而不是在创建时设置价格并断开连接。但这取决于你想要什么。将价格设置为空,如果它为空,则获取相关的DefaultMoviePriceForGenre
@WillemVanOnsem,但在哪里?模型实例化时是否有调用的方法?与问题的“如何在保存时调用自定义代码”部分无关-如果您也创建类型
模型,并使用ForeignKey
关系来确保数据正确一致,您会做得更好。