假设我有一个名为Hero的类,其名称为“name”。每次创建新的Hero对象时,我都想追加" is a hero"
。我可以使用__init__
吗?或者是否有我可以覆盖的django特定方法?
class Hero(modes.Model)
name = models.CharField(max_length=100)
def __init__(self, *args, **kwargs):
name += " is a hero"
super(Hero, self).__init__(*args, **kwargs)
答案 0 :(得分:18)
如果通过“每次创建一个新的Hero对象”,你的意思是“每次在数据库中创建一个Hero记录”,那么不,你不想在__init__
方法中这样做,因为只要在Python中创建Hero对象时就会调用它,包括刚刚从数据库中获取现有记录时。
要做你想做的事,你可以使用Django的post_save signal,检查created
关键字参数为True的信号回调,如果是,则执行“on creation”逻辑。
或者,在某些情况下更直接和自然,您可以覆盖Hero的save()
方法,如下所示:
def save(self, *args, **kwargs):
if not self.pk: # object is being created, thus no primary key field yet
self.name += " is a hero"
super(Hero, self).save(*args, **kwargs)
请注意,Djagno的bulk_create
方法将跳过触发保存后信号或调用save
。