簡體   English   中英

作為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)

首先,我只編寫了url字段。 然后我添加了shortcode字段並提供了一個函數來調用以創建默認的唯一值。 Django的文檔說

如果可調用,則每次創建新對象時都會調用它。

不幸的是,在運行遷移時,我看到只生成了一個短網址,並出現以下異常:

$ 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

為每個要遷移的條目調用該函數缺少什么?

最初,您需要在短代碼字段上推遲唯一約束並允許空值,然后重新創建並運行遷移。(不要忘記刪除失敗的遷移)

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)將模型更改為原始定義並創建新的自動遷移並運行它。

有關更多信息,請參閱此處: 添加唯一字段的遷移

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM