Django 无法识别模型中的特定更改

Django does not recognize specific change in model

class Category(models.Model):
    name = models.CharField(max_length=128 , unique=True)
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)

    # we override save so as to convert name to a slug
    ### essentially -> name.lower().replace(" " , "-")

    def save(self,*args,**kwargs):
        self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "Categories"

保存覆盖未注册。我在尝试 运行 makemigrations.

时收到 "No changes detected in app" 消息

我尝试在其他方法中进行更改,并且可以识别更改。

可能是什么原因造成的?

迁移仅针对 数据库 更改;您在保存方法中的重写与数据库没有任何关系(例如添加新字段等),因此它不会生成任何迁移。

迁移对数据库进行更改。覆盖方法、添加属性、定义新方法等都位于Python/Django层,与数据库没有关系,因此有不需要 迁移。您将如何使用给定的新 .save(..) 方法更改数据库?

如果您需要填充现有记录,您可以构建一个 data migration [Django-doc]。您可以构建这样的迁移:

python manage.py makemigrations <b>--empty</b> <i>appname</i>

然后指定迁移方式(例如,通过手动遍历您的记录,并每次计算 slug)。

请注意,您的 Category 模型也有 no slug 字段,因此这意味着 self.slug = … 不是很有用。您将向模型对象添加属性 .slug。但是一旦该对象不再存在于内存中,该数据就不再可用。此外,您无法搜索 slug,因为 slug 未存储在数据库中。

您可能想看看 django-autoslug package [readthedocs]。这允许您定义一个 AutoSlugField,并指定如何填充它。此外,这个包将尝试找到一个 unique slug,毕竟不同的名称严格来说可能会导致相同的 slug。

from autoslug import <b>AutoSlugField</b>

class Category(models.Model):
    name = models.CharField(max_length=128 , unique=True)
    <b>slug = AutoSlugField(populate_from='name')</b>
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "Categories"