2017-11-29 5 views
0

Ich habe ein Django-Modell, das Werte in einem JSON-Feld gespeichert hat. aber einige der Werte müssen eindeutig sein, dafür habe ich eine Funktion check_unique(). aber diese Überprüfung schlägt fehl, wenn zwei Benutzer versuchen, den gleichen Wert zur gleichen Zeit zu speichern, seit check_unique() ausgeführt wurde, keiner der Werte in der Datenbank gespeichert ist und sie dann individuell korrekt sind. Es gibt eine Möglichkeit, dieses Verhalten zu vermeiden? Ich habe versucht, dies zu vermeiden mit trheadeing.Lock, aber Apache läuft in verschiedenen Prozessen und es funktioniert nicht in diesem Fall.Selbstausschluss Ausführung der Funktionen in Django

Außerdem möchte ich, dass die Prüfung auf Anwendungsebene (in Python) und nicht auf Datenbankebene sein würde.

der Code sieht wie folgt aus:

semaphore.claim() 
try: 
    uniques = check_unique(self.answers) 
    if not uniques: 
     self.go_save() 
     semaphore.release() 
     return Response("All OK") 
except Exception as e: 
     semaphore.release() 
     return e 

Antwort

0

Haben Sie auf atomarer Anfragen in Django sah? https://docs.djangoproject.com/en/1.11/topics/db/transactions/#django.db.transaction.atomic

Aas soweit ich weiß, wenn Sie diese Transaktion mit der atomaren Datenbank machen, wäre es nicht in der Lage für den zweiten Benutzer, um es in der Datenbank zu speichern. Im Grunde ist es atomar, dass es versucht, die Werte in der Datenbank zu speichern, aber wenn es eine Ausnahme erkennt, werden diese Änderungen in der Datenbank wiederhergestellt.

Ein anderer Ansatz wäre, einen benutzerdefinierten Validator zu erstellen, der den Wert zweimal überprüft. So wird es einmal überprüfen, ob der Wert in der DB vorhanden ist, und dann x Sekunden später (randomize das, so dass beide Benutzer nicht in der Lage sein werden, genau die gleiche Zeit zu validieren). Auf diese Weise, wenn Benutzer 1 es bereits in der Datenbank gespeichert hat, würde die zweite Prüfung es sehen und den Vorgang abbrechen.

Schließlich überprüfen Sie https://github.com/alecthomas/voluptuous. Vielleicht ist es das, was du brauchst!

Hoffnung, das hilft.

Verwandte Themen