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"
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
.
我尝试在其他方法中进行更改,并且可以识别更改。
可能是什么原因造成的?
迁移仅针对 数据库 更改;您在保存方法中的重写与数据库没有任何关系(例如添加新字段等),因此它不会生成任何迁移。
迁移对数据库进行更改。覆盖方法、添加属性、定义新方法等都位于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"