2016-11-07 11 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

ありがとう、それはやっていなければならない方法のようです。とにかく私たちが1つの「自動魔法」のステップでそれをすることができないのは少し驚くべきことです。 ?!? – samb

答えて

0

最初に、あなたはショートフィールドに一意の制約を延期し、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)モデルを元の定義に変更し、新しい自動移行を作成して実行します。

は、詳細についてはこちらを参照してください:Migrations that add unique fields