提问人:samb 提问时间:11/7/2016 更新时间:11/8/2016 访问量:824
默认值 callable 在 Django 迁移期间仅调用一次
default value as callable is only called once during django migration
问:
我创建了以下基本的 django 模型:
import string
import random
from django.db import models
def create_short_url():
size = 6
chars = string.ascii_uppercase + string.digits
url = ''.join(random.choice(chars) for _ in range(size))
print("\nSHORT_URL:%s\n" % url)
return url
class ShortURL(models.Model):
url = models.CharField(max_length=220, )
shortcode = models.CharField(max_length=15, unique=True, default=create_short_url)
def __str__(self):
return str(self.url)
首先,我只对字段进行了编码。然后,我添加了该字段,并提供了一个函数来调用以创建默认的唯一值。
Django 的文档说url
shortcode
如果可调用,则每次创建新对象时都会调用它。
不幸的是,在运行迁移时,我只看到一个短 url 生成,并出现以下异常:
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, shortener
Running migrations:
Applying shortener.0002_auto_20161107_1529...
SHORT_URL:43AY7G
Traceback (most recent call last):
File "/home/user/django1.10/py3/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "/home/user/django1.10/py3/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 337, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: UNIQUE constraint failed: shortener_shorturl.shortcode
对于要迁移的每个条目,调用该函数缺少什么?
答:
1赞
mrmick
11/8/2016
#1
最初,您需要推迟对简码字段的唯一约束并允许 null 值,然后重新创建并运行迁移。(不要忘记删除失败的迁移)
class ShortURL(models.Model):
url = models.CharField(max_length=220, )
shortcode = models.CharField(max_length=15, null=True)
def __str__(self):
return str(self.url)
之后,1) 创建一个新的空迁移并添加一个利用 create_short_url() 的 RunPython 操作。 2)将模型更改为原始定义,然后创建新的自动迁移并运行它。
有关详细信息,请参阅此处:添加唯一字段的迁移
评论