django 模型保存 - 覆盖迁移期间未调用的方法
django model save - override method not invoked during migrations
我的模型中有一个保存覆盖方法 class,每次保存对象时都会生成一个新的 slug。
def save(self, *args, **kwargs):
if self.column2:
self.slug = slugify(self.column1 + " " + self.column2)
else:
self.slug = slugify(self.column1)
print slug
super(MyModel, self).save(*args, **kwargs)
当我尝试通过登录 python shell 创建新对象时,我看到正在调用保存方法。
python manage.py shell
>>> MyModel(column1="test",column2="2015").save()
slug is test-2015
然而,当我 运行 迁移时,这个保存覆盖方法没有被调用。这是我的迁移脚本的一部分..
...
def add_myModel_details(apps, schema_editor):
x = apps.get_model("myapp","myModel")
MyModel(column1 = "test", column2="2015" ).save()
.....
slug 是空的,因为没有调用保存覆盖。
发生这种情况是因为迁移没有调用您的 save
方法。
我认为保存方法不是生成 slug 的最佳位置。最好使用 AutoSlugField 或 signals.
1. signals:
在您的情况下,您可以使用信号 pre_save。
示例:
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
my_model = kwargs.get('instance')
if my_model.column2:
my_model.slug = slugify(my_model.column1 + " " + my_model.column2)
else:
my_model.slug = slugify(my_model.column1)
print my_model.slug
2。 AutoSlugField:
这不是标准字段,但很多库都实现了它。我也使用 django-extensions. This field uses signals 中的 AutoSlugField。
示例:
slug = AutoSlugField(populate_from=("column1", "column2"))
3。 save
方法和迁移
但如果您仍想使用 save
方法生成 slug,我建议您创建数据迁移并手动添加 slug。
自定义模型方法在迁移过程中不可用。
相反,您可以 运行 将代码放入 RunPython
函数中,按照自定义 save()
的方式修改您的模型实例。
参考文献:
我的模型中有一个保存覆盖方法 class,每次保存对象时都会生成一个新的 slug。
def save(self, *args, **kwargs):
if self.column2:
self.slug = slugify(self.column1 + " " + self.column2)
else:
self.slug = slugify(self.column1)
print slug
super(MyModel, self).save(*args, **kwargs)
当我尝试通过登录 python shell 创建新对象时,我看到正在调用保存方法。
python manage.py shell
>>> MyModel(column1="test",column2="2015").save()
slug is test-2015
然而,当我 运行 迁移时,这个保存覆盖方法没有被调用。这是我的迁移脚本的一部分..
...
def add_myModel_details(apps, schema_editor):
x = apps.get_model("myapp","myModel")
MyModel(column1 = "test", column2="2015" ).save()
.....
slug 是空的,因为没有调用保存覆盖。
发生这种情况是因为迁移没有调用您的 save
方法。
我认为保存方法不是生成 slug 的最佳位置。最好使用 AutoSlugField 或 signals.
1. signals:
在您的情况下,您可以使用信号 pre_save。
示例:
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
my_model = kwargs.get('instance')
if my_model.column2:
my_model.slug = slugify(my_model.column1 + " " + my_model.column2)
else:
my_model.slug = slugify(my_model.column1)
print my_model.slug
2。 AutoSlugField:
这不是标准字段,但很多库都实现了它。我也使用 django-extensions. This field uses signals 中的 AutoSlugField。
示例:
slug = AutoSlugField(populate_from=("column1", "column2"))
3。 save
方法和迁移
但如果您仍想使用 save
方法生成 slug,我建议您创建数据迁移并手动添加 slug。
自定义模型方法在迁移过程中不可用。
相反,您可以 运行 将代码放入 RunPython
函数中,按照自定义 save()
的方式修改您的模型实例。