使用已填充的模型添加非空和唯一字段
Add non-null and unique field with already populated model
我的应用程序中有一个模型在服务器上运行,其中包含一些条目。我需要为此模型添加一个 SlugField
,唯一且非空。 SlugField
将根据 trading_name
填充。我更改了我的模型以添加这个新字段并修改了保存方法:
class Supplier(StatusModel):
SLUG_MAX_LENGTH = 210
slug = models.SlugField(unique=True, max_length=SLUG_MAX_LENGTH)
trading_name = models.CharField(max_length=200, verbose_name=_('trading name'))
...
def save(self, *args, **kwargs):
self.slug = orig = slugify(self.trading_name)[:Supplier.SLUG_MAX_LENGTH]
for x in itertools.count(1):
if not Supplier.objects.filter(slug=self.slug).exists():
break
# Truncate the original slug dynamically. Minus 1 for the hyphen.
self.slug = "%s-%d" % (orig[:Supplier.SLUG_MAX_LENGTH - len(str(x)) - 1], x)
self.full_clean()
super(Supplier, self).save(*args, **kwargs)
更改模型后,我运行 manage.py makemigrations
并将此迁移作为输出:
class Migration(migrations.Migration):
dependencies = [
('opti', '0003_auto_20141226_1755'),
]
operations = [
migrations.AddField(
model_name='supplier',
name='slug',
field=models.SlugField(unique=True, default='', max_length=210),
preserve_default=False,
),
]
我无法运行 manage.py migrate
因为默认值由于唯一的限制而无法工作。
我的问题是:如何使用 Django 1.7 执行此操作?我需要应用架构更改并将当前条目保留在我的数据库中。
您进行模型更改(添加字段、更改等),然后调用 manage.py makemigrations
,然后使用 manage.py migrate
应用迁移
您可以使用 null=True
添加字段,然后您例如制作一个脚本来一次性填充它
否则,如果您需要在迁移中填充字段,您可以编写一个自定义字段,请参阅 https://docs.djangoproject.com/en/1.7/ref/migration-operations/#writing-your-own
不幸的是,我没有找到答案,但我可以创建一个解决方案:
- 首先,我创建了一个允许 slug 字段可为空的迁移;
- 然后我创建了另一个迁移,用适当的值填充 slug 列到模型中的每一行;
- 然后是在列中添加非空约束的另一个迁移。
我的应用程序中有一个模型在服务器上运行,其中包含一些条目。我需要为此模型添加一个 SlugField
,唯一且非空。 SlugField
将根据 trading_name
填充。我更改了我的模型以添加这个新字段并修改了保存方法:
class Supplier(StatusModel):
SLUG_MAX_LENGTH = 210
slug = models.SlugField(unique=True, max_length=SLUG_MAX_LENGTH)
trading_name = models.CharField(max_length=200, verbose_name=_('trading name'))
...
def save(self, *args, **kwargs):
self.slug = orig = slugify(self.trading_name)[:Supplier.SLUG_MAX_LENGTH]
for x in itertools.count(1):
if not Supplier.objects.filter(slug=self.slug).exists():
break
# Truncate the original slug dynamically. Minus 1 for the hyphen.
self.slug = "%s-%d" % (orig[:Supplier.SLUG_MAX_LENGTH - len(str(x)) - 1], x)
self.full_clean()
super(Supplier, self).save(*args, **kwargs)
更改模型后,我运行 manage.py makemigrations
并将此迁移作为输出:
class Migration(migrations.Migration):
dependencies = [
('opti', '0003_auto_20141226_1755'),
]
operations = [
migrations.AddField(
model_name='supplier',
name='slug',
field=models.SlugField(unique=True, default='', max_length=210),
preserve_default=False,
),
]
我无法运行 manage.py migrate
因为默认值由于唯一的限制而无法工作。
我的问题是:如何使用 Django 1.7 执行此操作?我需要应用架构更改并将当前条目保留在我的数据库中。
您进行模型更改(添加字段、更改等),然后调用 manage.py makemigrations
,然后使用 manage.py migrate
您可以使用 null=True
添加字段,然后您例如制作一个脚本来一次性填充它
否则,如果您需要在迁移中填充字段,您可以编写一个自定义字段,请参阅 https://docs.djangoproject.com/en/1.7/ref/migration-operations/#writing-your-own
不幸的是,我没有找到答案,但我可以创建一个解决方案:
- 首先,我创建了一个允许 slug 字段可为空的迁移;
- 然后我创建了另一个迁移,用适当的值填充 slug 列到模型中的每一行;
- 然后是在列中添加非空约束的另一个迁移。