2016-06-17 12 views
1

Ich finde heraus, dass delete() eines verwandten Objekts löscht es nicht sofort. In meinem Fall kommt die Vader Instanz durch instance Parameter eines Serializers update Methode.Wie Eigenschaft entfernen Objekte (sofort)

Wie lösche ich sofort v.son?

class Vader(models.Model): 
    pass 

class Luke(models.Model): 
    dad = models.OneToOneField(Vader, related_name='son') 

>>> v = Vader() 
>>> hasattr(v, 'son') 
False 
>>> l = Luke(dad=v) 
>>> l.save() 
>>> hasattr(v, 'son') 
True 
>>> v.son 
<Luke: Luke object> 
>>> v.son.delete() 
>>> hasattr(v, 'son') 
True 
>>> v.son 
<Luke: Luke object> 

Antwort

3

Das Löschen in der Datenbank wird sofort ausgeführt, aber nicht in den bereits geladenen Modellinstanzen. Dies ist normalerweise kein Problem, da django wie HTTP funktioniert - eine Anfrage kommt, eine Verarbeitung passiert, dann ist der Zustand verloren.

können Sie das Modell zwingen, aus der Datenbank neu zu laden um die Änderungen zu sehen:

v.refresh_from_db() 
+0

Dies funktionierte nicht. Ich musste 'v = Vader.objects.get (id = v.id)' machen. Ich frage mich, ob das etwas mit der 'OneToOne'-Beziehung zu tun hat? Ein 'refresh_from_db()' hat nur die 'Vader' Tabelle abgefragt, während' .get() 'auch alle 'OneToOne' bezogenen Tabellen abgefragt hat. –

+0

Nur hinzufügen, nach dem '.delete()' das 'v.son' ist weiterhin ein' Luke' Objekt, nur seine 'id' ist None. Dies blieb auch nach '.refresh_from_db()' –

+0

Ich habe meinen Scheck auf 'hasattr (v, 'son') und v.son.id' erweitert. Dort findet keine Datenbankabfrage mit diesem. –

Verwandte Themen