【问题标题】:Django migration not calling overridden save() method?Django 迁移不调用覆盖的 save() 方法?
【发布时间】:2018-12-08 00:14:50
【问题描述】:

我有一个模型SessionCategory,类似于以下内容:

from django.db import models
from django.utils.text import slugify


class SessionCategory(models.Model):
    name = models.CharField(max_length=255, unique=True)
    name_slug = models.CharField(max_length=255, null=True)

    def save(self, *args, **kwargs):
        if not self.name_slug:
            self.name_slug = slugify(self.name)
        super().save(*args, **kwargs)

因此,我想添加的 name_slug 字段是 name 字段的 slugified 版本。

我已经运行了以下数据迁移:

from __future__ import unicode_literals

from django.db import migrations, models


def generate_name_slugs(apps, schema_editor):
    SessionType = apps.get_model('lucy_web', 'SessionType')
    for session_type in SessionType.objects.all():
        session_type.save()


class Migration(migrations.Migration):

    dependencies = [
        ('lucy_web', '0163_auto_20180627_1309'),
    ]

    operations = [
        migrations.AddField(
            model_name='sessioncategory',
            name='name_slug',
            field=models.CharField(max_length=255, null=True),
        ),
        migrations.RunPython(
            generate_name_slugs,
            reverse_code=migrations.RunPython.noop),
    ]

但是,如果我之后检查数据库,name_slug 字段都是空的:

我还反转了迁移并重新运行它,在覆盖的 save() 方法中设置跟踪 (import ipdb; ipdb.set_trace()),但它没有导致 Python 进入调试器,确认该方法不是调用。

为什么没有调用被覆盖的save() 方法?我必须在generate_name_slugs 函数中复制代码吗?

【问题讨论】:

标签: python django database-migration


【解决方案1】:

这应该有助于SessionType...SessionCategory 可以用同样的方式修改...

def generate_name_slugs(apps, schema_editor):
    import lucy_web.models as m
    for session_type in m.SessionType.objects.all():
        session_type.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2021-04-10
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    相关资源
    最近更新 更多