【问题标题】:default value as callable is only called once during django migration在 django 迁移期间仅调用一次作为可调用的默认值
【发布时间】:2017-03-21 00:25:41
【问题描述】:

我创建了以下基本 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)

首先我只编码了url 字段。然后我添加了shortcode 字段并提供了一个函数来调用以创建默认唯一值。 Django 的文档说

如果可调用,则每次创建新对象时都会调用它。

不幸的是,在运行迁移时,我只看到生成了一个短 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

为每个要迁移的条目调用该函数缺少什么?

【问题讨论】:

  • 请参阅Migrations that add unique fields 以修复错误。
  • 谢谢,这似乎是它必须完成的方式。无论如何,我们不能在一个“自动魔术”步骤中做到这一点有点令人惊讶。 ?!?

标签: python django django-models


【解决方案1】:

最初,您需要推迟短代码字段的唯一约束并允许空值,然后重新创建并运行您的迁移。(不要忘记删除失败的迁移)

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)将您的模型更改为原始定义并创建新的自动迁移并运行它。

请参阅此处了解更多信息:Migrations that add unique fields

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 2017-07-18
    • 2016-09-29
    • 2019-07-18
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多