【问题标题】:Django does not recognize specific change in modelDjango 无法识别模型中的特定变化
【发布时间】:2020-01-05 15:54:54
【问题描述】:
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 时收到“在应用程序中未检测到更改” 消息。

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

这可能是什么原因造成的?

【问题讨论】:

  • save 覆盖确实不会对数据库表产生任何更改。因此无需更改。

标签: django django-models django-migrations


【解决方案1】:

迁移仅用于数据库更改;您在 save 方法中的覆盖与数据库没有任何关系(例如添加新字段等),因此不会生成任何迁移。

【讨论】:

    【解决方案2】:

    迁移对数据库进行更改。覆盖方法、添加属性、定义新方法等都位于 Python/Django 级别,与数据库nothing,因此no迁移必要的。您将如何使用给定的新 .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 AutoSlugField
    
    class Category(models.Model):
        name = models.CharField(max_length=128 , unique=True)
        slug = AutoSlugField(populate_from='name')
        views = models.IntegerField(default=0)
        likes = models.IntegerField(default=0)
    
        def __str__(self):
            return self.name
    
        class Meta:
            verbose_name_plural = "Categories"

    【讨论】:

    • 一个缺失的字段让我了解了迁移的实际作用。到目前为止,我认为这是models.py 文件的一种版本控制。感谢您的帮助!
    猜你喜欢
    • 2019-11-01
    • 2021-08-22
    • 2020-05-07
    • 1970-01-01
    • 2016-08-23
    • 2013-08-13
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多