default
の値をcallableに設定することができます。これはオブジェクトが作成されるたびに関数を呼び出すためですが、フィールドdefinitそれは
unique_id = models.CharField(db_index=True, default=generate_id)
intepret時間に一度呼び出されます上の第二に、私はあなたのためにランダムな文字列の生成を行いである、UUIDField
を使用することをお勧めします。
問題を解決するには2つの方法があります。 unique_id
かなり長い12文字以上の長さを生成します。これにより、衝突が発生しないことがほとんど保証されます。それとも、この方法では、あなたのgenerate_id
機能
def generate_id(length=6):
unique_id = ''.join(random.choice(a) for i in range(length))
while Mymodel.objects.filter(unique_id=unique_id).exists():
unique_id = ''.join(random.choice(a) for i in range(length))
return unique_id
答えるコメント モデルが
class Post(models.Model):
def _generate_id(self, length=6):
unique_id = ''.join(random.choice(a) for i in range(length))
while self.__class__.objects.filter(unique_id=unique_id).exists():
unique_id = ''.join(random.choice(a) for i in range(length))
return unique_id
以下の例のようにself.__class__
を介してアクセスすることができる。しかし、それはあなたがしません方法になる場合には、DBのチェックを追加することができますself
インスタンスが存在しないため、デフォルト値としてフィールドに追加できます。しかし、@classmethod
デコレータを試してみることもできます。これは、オブジェクトをインスタンス化する前に_generate_id
を定義し、@classmethods
としか動作しない場合にのみ可能です。これは、Pythonクラスが独自の小さな名前空間であるためです。
class Post(models.Model):
@classmethod
def _generate_id(cls, length=6):
unique_id = ''.join(random.choice(a) for i in range(length))
while cls.objects.filter(unique_id=unique_id).exists():
unique_id = ''.join(random.choice(a) for i in range(length))
return unique_id
unique_id = models.CharField(db_index=True, default=_generate_id, max_length=12)
しかし、私は実生活でこれを試したことはありません。
デフォルトの属性で関数を呼び出すべきではないことに注意してください。呼び出し可能なもの自体を渡すだけです。 –
ヘッドアップありがとうございます。 – static