1

model.py一意の識別子を生成するために、次のことを行いました。

 12 def rand_key(size):
 13     return ''.join([random.choice(string.letters + string.digits) for i in range(size)])
 14 
 15 
 16 class Share(models.Model):
 17 
 20     resource_content_type = models.ForeignKey(ContentType)
 21     resource_object_id = models.PositiveIntegerField()
 22     resource_content_object = generic.GenericForeignKey('resource_content_type', 'resource_object_id')
 23 
 24     identifier = models.CharField(max_length=16,unique=True,default=rand_key(16))

問題は、2 つのレコードを連続して保存しようとすると、エラー メッセージが表示duplicate key value violates unique constraint "share_share_identifier_key"されることです。これは共通の機能だと確信しています。

私が間違っていることは何ですか?

ありがとう

編集:最初のレコードが問題なく作成され、識別子フィールドに適切な「ランダム」値があることを追加させてください。クラッシュが発生する 2 番目のレコードの作成中です。rand_key関数が何らかの形でキャッシュされているようです。

4

2 に答える 2

5

問題は、ランダム関数の出力をデフォルトの引数に割り当てていることです。その後、値はすべてのエントリで同じになります。このコードを試してください

def rand_key(size):
    return ''.join([random.choice(string.letters + string.digits) for i in range(size)])


class Share(models.Model):
    resource_content_type = models.ForeignKey(ContentType)
    resource_object_id = models.PositiveIntegerField()
    resource_content_object = generic.GenericForeignKey('resource_content_type', 'resource_object_id')
    identifier = models.CharField(max_length=16, unique=True)

    def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):
        if self.identifier is None:
            self.identifier = rand_key(16)
        models.Model.save(self, force_insert, force_update, using, update_fields)

これにより、エントリが保存されるたびにランダムな文字が生成されます。

于 2013-05-11T18:08:15.837 に答える
2

Muhammed K K の回答に対するいくつかの修正 (コメントはありますが、許可されていません)。これはモデルの保存方法をオーバーライドしており、モデルを初めて保存するときに一意の ID を追加します。

def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):
        if self.identifier is None or len(self.identifier) == 0:
            self.identifier = rand_key(16)
        models.Model.save(self, force_insert, force_update, using, update_fields)

保存する最初の引数として self を渡し、識別子が空の文字列または null であることを確認する必要がありました。これらの違いの原因が何であるか、または彼の答えがそのまま使用されることを意図していないかどうかはわかりません...私はDjango 1.6とpython 2.6を使用しています。

于 2014-01-19T20:37:09.353 に答える