一意のエントリを保証する関数 (create_unique) を呼び出す変数 inv を持つモデル (models.py の Invitation) があります。
models.py
class Invitation(models.Model):
inv = models.Charfield(unique=True, default=create_unique)
class OtherModel(models.Model):
...
関数 create_unique は、invitations.py にあります。問題は、Invitation や、invitations.py の models.py から別のモデルをインポートしようとするたびに、循環インポートが発生し、どうすれば解決できるのか疑問に思うことです。
問題の解決策は2つしか見つかりませんでした:
# create_unique を notifications.py の外に移動しますが、実際にはそこに属します... # モデルをファイルの先頭ではなく、invitations.py の関数内にインポートします。
関数の外部でインポートが必要になる場合があるため (つまり、シグナル レシーバー デコレーターの場合)、このソリューションは最適ではありません。
招待状.py
from models.py import Invitation, OtherModel # this causes a circular import
def create_unique():
unique = 'a unique string'
return unique
def other_function():
# this works but is redundant and limited to the function itself
from models.py import Invitation, OtherModel
モデルで、関数の名前を文字列 (default='create_unique') として指定しようとしましたが、これは明らかに機能しません。
ありがとう!
編集:
完全な create_unique 関数:
def create_unique(length=30):
i=0
max = 100
while (i<max):
unique = u''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(length))
try:
Invitation.objects.get(invite=unique)
return create_unique()
except Exception:
return unique