2009-01-21 5 views
2

Je voudrais trouver un moyen générique d'empêcher l'enregistrement d'un objet s'il est sauvegardé après l'avoir vérifié.Comment empêcher l'écrasement d'un objet modifié par quelqu'un d'autre

Nous pouvons supposer que l'objet a un champ timestamp qui contient la dernière modification. Si j'avais extrait (visité une vue en utilisant un ModelForm par exemple) à t1 et l'objet est enregistré à nouveau à t2, donné t2>t1 Je ne devrais pas être en mesure de l'enregistrer.

+0

Vous voulez vous empêcher de faire quelque chose? Pourquoi ne pas simplement l'enregistrer deux fois? – nosklo

+0

Regardez ici: http://stackoverflow.com/questions/320096/django-how-can-i-protect-against-codurrent-modification-of-data-base-entries – tvanfosson

+0

@nosklo: une application web est typiquement multi utilisateur, donc je ne suis pas nécessairement m'empêcher. Je veux éviter d'enregistrer sur les modifications de quelqu'un d'autre sans le remarquer. – muhuk

Répondre

3

la méthode save Ecraser qui d'abord vérifier la dernière estampille temporelle:

def save(self): 
    if(self.id): 
     foo = Foo.objects.get(pk=self.id) 
     if(foo.timestamp > self.timestamp): 
      raise Exception, "trying to save outdated Foo" 
    super(Foo, self).save() 
+1

Une condition de concurrence peut se produire entre l'horodatage si la vérification et la requête de mise à jour SQL. la condition doit faire partie de la requête de mise à jour qui est atomique. –

+0

Méfiez-vous, cette réponse n'est pas correcte pour la raison Andrei indiqué ci-dessus !! Il vous posera de sérieux problèmes si vous l'utilisez en production. Voir cette question pour plus d'informations: http://stackoverflow.com/questions/320096/django-how-can-i-protect-against-concurrent-modification-of-database-entries –

Questions connexes