2011-01-06 8 views
5

私はDjangoのモデルにcustom primary keysを使用しています。 (私はデータベースに値をインポートしたので、これがあって、彼らはすでにIDの添付していた、それは既存の値を保持するために意味を成していた。)Django:カスタムPK自動インクリメントを作成していますか?

class Transaction(models.Model): 
    id = models.IntegerField(primary_key=True) 
    transaction_type = models.IntegerField(choices=TRANSACTION_TYPES) 
    date_added = models.DateTimeField(auto_now_add=True) 

しかし、今私は、モデルの新しいインスタンスを追加しますデータベース、私は一意の主キーを自動生成したいと思います。私は、新しい値に指定する固有のIDを自動生成するにはどうすればよい

IntegrityError at /page 
(1048, "Column 'id' cannot be null") 

t = Transaction(transaction_type=0) 
t.save() 

ができます:私はインスタンスを作成する際のIDを指定しない場合でも、私はエラーを取得します既存の値をインポートする方法を変更する必要はありませんか?

UPDATE

私はどのように既存の値をインポートしている動作するようです。このカスタムメソッド、...

class Transaction(models.Model): 
    def save(self, *args, **kwargs): 
     if not self.id: 
      i = Transaction.objects.all().order_by('-id')[0] 
      self.id = i.id+1 
     super(Transaction, self).save(*args, **kwargs) 
+0

私は興味があります - 一括インポートを行っている場合、djangoが主キーを処理する問題は何ですか?運用/稼働中のシステムにインポートする場合を除いて、主キーが問題となる状況は一度もありませんでした。 –

答えて

1

を書きましたか? Transaction__init__に何かを書き込んで新しいIDを生成するのは簡単ですが、他の値をどのようにインポートしているのかわからなくても、自分の作業方法を変更するかどうかはわかりません。

+0

CSVファイルから、カスタムインポートスクリプトを使用して、そしてトランザクションIDフィールドをCSVファイルのIDに設定して、これがあなたの質問に答えるかどうかはわかりません。 (また、直接SQLではなくDjangoオブジェクトを使用してインポートします)。 – AP257

+0

はい。あなたの 'Transaction's' __init__'を書くのではなく、 'save()'をオーバーライドしてIDがあるかどうかをチェックし、そうでなければ新しいものを生成します)。 – girasquid

+0

私は 'save()'をオーバーライドして上記のアップデートとして追加しました。これが漠然として見えるかどうか教えてください。ありがとう! – AP257

2

の代わりにidの列にAutoFieldを使用できます。次はあなたのために働く必要があります。

id = models.AutoField(primary_key=True) 

idが自動的に増加し、それがsave方法で発生する可能性があるとして、同時実行性の問題を持っていません。

2

私は、コードの非常に類似した作品を使用して終了しましたが、それはもう少し一般的な作られています

def save(self, *args, **kwargs): 
    if self.id is None: 
     self.id = self.__class__.objects.all().order_by("-id")[0].id + 1 
    super(self.__class__, self).save(*args, **kwargs) 

それはあなただけでは何も変更せずに任意のモデルクラスにこのコードをコピー&ペーストすることができますので、self.__class__を使用しています。

0

あなたが宣言したidフィールドを削除した場合、Djangoは自動的にこの仮定します:Djangoの1.8、inspectdb

id = models.AutoField(primary_key=True) 

が自動的auto_incrementを検出し、AutoField生成モデルを使用します。

関連する問題