2016-06-27 8 views
1

私はモデルのpre_save信号で作業しています。レコードがINSERTかUPDATEかどうかを確認する方法はわかりません。以下のコードは正常に動作しません。Django pre_save信号:InsertまたはUpdateの場合はどうすればわかりますか

@receiver(pre_save, sender=Person) 
def pre_save_person(sender, instance, **kwargs): 

    if not instance.pk: 
     print 'INSERT !!!!!!' 
    else: 
     print 'UPDATE !!!!!!' 

私を助けてくれますか?プロジェクトはdjango 1.8.7を使用しています。あなたは具体的には以下の

+0

if条件が間違った方法であることを除いて、これは機能します。 –

+0

@DanielRosemanええ、私は条件が間違っているのを見ました。しかし、それはとにかく動作しません。 Instance.pkは常に存在する –

+1

pkが存在する場合、Djangoは更新または挿入のいずれかを知らない。その場合、Djangoはアップデートを試みますが、失敗した場合はインサートに戻ります。インスタンスが保存される前にアプリケーションがpkを設定していれば、dbに一致するpkを問い合わせることによってのみ確実に見つけることができます。 – knbk

答えて

2

をpre_save必要がない限り、任意のヘルプ

+0

これは、追加のデータベースクエリにつながります。プライマリキーに基づいて単一のアイテムを取得することは非常に高速ですが、可能な限り追加のクエリを避ける方が良い方法です。 – e4c5

+0

@ e4c5良いヒントと私は同じことを考えていました。この場合、どのように追加クエリを避けますか? – Jarad

0

ため

おかげ

if instance.pk is None: print "inserting" else: print "updating"

ですべての場合において、この文句を言わない作業を試してみてください、私はあなたが作成した旗を持っているpost_saveを使用することをお勧めします@ knbkコメントでは、この時点でinstance.pkが常に存在します。このinstance.pkがデータベースに存在するかどうかを確認する必要があります。

@receiver(pre_save, sender=Person) 
def pre_save_person(sender, instance, **kwargs): 

    num = Person.objects.filter(pk=instance.pk).count() 
    if num == 0 : 
     print 'INSERT !!' 
    else: 
     print 'UPDATE !!' 
+0

あなたの答えをありがとう。それは動作しません、instance.pkは常にそこにあり、私は関連するモデルのレコードを作成しているので私は投稿を使用することはできません –

関連する問題