2016-08-19 14 views
0

私はこのような私のmodels.pyでは非常に単純なモデルがあります。この場合モデル値変更条件のDjangoシグナル?

class Music(models.Model): 
    title= models.CharField(
     max_length=100 
    ) 

    description = models.TextField(
     null=True, 
     blank=True 
    ) 

    def __unicode__(self): 
     return self.name 


class Album(models.Model): 
    musician= models.CharField(
     related_name='musician', 
     max_length=100 
    ) 

    music = models.ForeignKey(
     Music, 
     related_name='music' 
    ) 

    def __unicode__(self): 
     return self.user.username 

を、私は新しいフィールド(新しい音楽が)だけ持っているかどうかを確認するために私のsignals.pyに非常にシンプルなロジックを作りましたアルバムに追加されました。他の条件で

@receiver(post_save, sender=Album) 
def add_new_album(sender, instance, **kwargs): 
    if kwargs.get('created'): 
     print "new album recently created" 

、私は既存のフィールドを新しいものに編集された場合にのみ対応する信号を作りたい:

edit_album = Album.objects.get(pk=1) 
edit_album.music = Music.objects.get(title="something_else") 
edit_album.save() 

このような

Album(musician="someone", music=Music.objects.get(title="something")) #pk=1 
Album.save() 

post_saveレシーバを使用するadd_new_album()関数は、私が既存のフィールドを編集するたびにトリガされます。だから私の質問は、signals.pyに実装されるべきロジックは何ですか?フィールド条件?

答えて

0

私は、特定のフィールドが正しく変更された場合にのみ信号をトリガーしたいですか?

@receiver(post_save, sender=<sender>, dispatch_uid=<string>) 
def method(sender, instance, **kwargs): 
    last_field_change = FieldHistory.objects.filter(field_name=<your_field_which_you_want_to_check_for_change>, 
              object_id=instance.id).last() 
    if last_field_change: 
     #do your thing 
: あなたはこのような何か Django Field history

というパッケージを使用することができます