2016-11-07 299 views
1

期間只調用一次我創建了以下基本的Django模型:默認值的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 

缺什麼呼籲每個條目功能被遷移?

+2

參見[遷移是添加獨特的領域(https://docs.djangoproject.com/en/1.10/howto/writing-migrations/#migrations-that-add-唯一字段)來修復錯誤。 – knbk

+0

謝謝,這似乎是它必須完成的方式。無論如何,我們無法在一個「自動魔法」步驟中做到這一點有點令人驚訝。 ?!? – samb

回答

0

最初,你將需要推遲對短碼領域的唯一約束,並允許空值,然後重新創建並運行遷移。(不要忘記刪除失敗遷移)

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