2017-07-06 31 views
1

Ich habe eine benutzerdefinierte Speichermethode für ein Modell.Django benutzerdefinierte speichern und aktualisieren

class Ticket(models.Model): 
    show = models.ForeignKey(Show) 
    seat = models.ForeignKey(Seat) 
    ref = models.CharField(max_length=100) 
    paid = models.BooleanField(default=False) 

    class Meta: 
     unique_together = ('show', 'seat') 

    def save(self, *args, **kwargs): 
     if self.paid: 
      do_something() 

Aus Sicht würde ich mehr Ticket-Objekte aktualisieren mag:

Ticket.objects.filter(ref='ref').update(paid=True) 

Aber, da dies die benutzerdefinierte Speichermethode nicht nennen. Die Methode do_something() wird nicht verarbeitet. Gibt es eine Möglichkeit, dieses Problem zu lösen?

Antwort

1

Die offensichtliche Lösung wäre:

for ticket in Ticket.objects.filter(ref='ref'): 
    ticket.paid = True 
    ticket.save() 

Wenn Sie die update aus Performance-Gründen tun Sie wollen Sie nicht aufgeben, tun könnte:

new_paid_tickets = Ticket.objects.filter(ref='ref') 
new_paid_tickets.update(paid=True) 
for ticket in new_paid_tickets: 
    do_something() 
1
def save(self, *args, **kwargs): 
     if self.paid: 
      do_something() 
    super(Ticket, self).save(*args, **kwargs) 

Verwendung dieser und den benutzerdefinierten Code in self.paid hinzufügen, hoffe, es

1

Zitat hilft von docs:

Beachten Sie, dass das Update() -Methode direkt in eine SQL umgewandelt Erklärung. Dies ist eine Massenoperation für direkte Aktualisierungen. Es werden keine save() -Methoden für Ihre Modelle ausgeführt oder die Signale pre_save oder post_save (die eine Konsequenz des Aufrufs von save() sind) ausgegeben oder die AutoNow-Feldoption berücksichtigt. Wenn Sie jedes Element in einem QuerySet speichern und sicherstellen möchten, dass die save() -Methode für jede Instanz aufgerufen wird, benötigen Sie keine spezielle Funktion, um das zu verarbeiten. Überschlinge sie einfach und rufe save() auf.

Sie müssen also über Abfrage-Set durchlaufen und save() Methode für jedes Element aufrufen.

Verwandte Themen