2016-08-19 3 views
0

Ich habe eine sehr einfache Modelle in meinem models.py wie folgt aus:Django Signale für Modelle Wertänderung Bedingung?

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 

In diesem Fall ich eine sehr einfache Logik in meinem signals.py nur, wenn das neue Feld (Neue Musik) hat um zu prüfen, zum Album hinzugefügt.

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

wie folgt aus:

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

In anderen Zustand, ich möchte Signale machen, die nur beantwortet werden, wenn die vorhandenen Felder in die neue bearbeitet:

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

Die Verwendung von Post_Save-Empfänger make add_new_album() -Funktion wird jedes Mal ausgelöst, wenn ich das vorhandene Feld bearbeite .. Also meine Frage ist, was ist die Logik, die in signals.py implementiert werden sollte, die nur die Editi antworten ng Felder Zustand?

Antwort

0

Also ich möchte Ihr Signal nur auslösen, wenn bestimmte Felder richtig geändert werden?

@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 
: Sie können ein Paket Django Field history

Etwas Ähnliches genannt verwenden