Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django在创建后设置模型字段_Python_Django_Django Models - Fatal编程技术网

Python Django在创建后设置模型字段

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

我有一部模型电影和一部模型DefaultMoviePrice,用于保存特定类型的默认价格:

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
关系来确保数据正确一致,您会做得更好。