2017-03-12 9 views
0

を更新する新しいレコードを作成し、私は次のモデルに持ってDjangoは代わりに

class FooBar(models.Model): 
    FOOBAR_ID = models.AutoField(primary_key=True) 
    foo = models.CharField(max_length=255) 
    bar = models.CharField(max_length=255) 

また、私は私がFooBarの既存のインスタンスを編集することができますフォームを作成しました。 fooが変更されたときに既存のレコードを更新したいが、barが変更されたときに新しいレコードを作成する。

メソッドをオーバーライドするのが良い方法を考え出しました。これは、FooBarモデルに以下を追加してデータベースに追加のクエリを実行する必要がなくなるためです。

__original_bar = None 

def __init__(self, *args, **kwargs): 
    super(FooBar, self).__init__(*args, **kwargs) 
    self.__original_bar = self.bar 

def save(self, force_insert=False, Force_update=False, *args, **kwargs): 
     if self.bar != self.__original_bar: 
      super(FooBar, self).save(force_insert=True, force_update=False, *args, **kwargs) 
      self.__original_bar= self.bar 
     else: 
      super(FooBar, self).save(force_insert=False, force_update=True, *args, **kwargs) 

私がfooのすべてが正常に動作しますが、私はバーを更新すると、次のエラーが表示される更新:

キー( "FOOBAR_ID")=(2)既に存在しています。

私は明らかにforce_insertの機能を完全に間違っています。保存で新しいレコードを作成するにはどうしたらいいですか?

答えて

1

プライマリキーをNoneに設定すると、Djangoは自動的に新しいレコードを作成します。これについてはdocsで詳しく読むことができます。

def save(self, *args, **kwargs): 
    if self.bar != self.__original_bar: 
     self.FOOBAR_ID = None 
     self.__original_bar= self.bar 
    super(FooBar, self).save(*args, **kwargs) 
0

バーを使用しているときは、このIDを削除する必要があります。データをフロントエンドに送信する前に削除してください。

何が起きているのかは、既に存在する主キー "Key(" FOOBAR_ID ")=(2)"を使用してデータベースに新しい行を追加しようとしていることです。

関連する問題