Ist djangos neues UUIDFields "default" Attribut kümmert sich um die Einzigartigkeit '

Nur sprang in django 1.8 für ein schnelles projekt und ich dachte, es gibt ein UUIDField in den Modellen.

Https://docs.djangoproject.com/de/1.8/ref/models/fields/#uuidfield

Ich benutze dies für ein externes ID-Feld, das jedes Modell das Objekt aussetzen muss. Wird der default Parameter die Einzigartigkeit behandeln oder muss ich ihn in den Save schreiben? Ich meine, ich weiß, dass es praktisch keine Chance gibt, Werte zu kollidieren, aber nur um zu wissen, wie es intern geschieht

3 Solutions collect form web for “Ist djangos neues UUIDFields "default" Attribut kümmert sich um die Einzigartigkeit '”

Wie garantiert das UUID-Modul einmalig einmalige Werte?

RFC 4122 (UUID-Modul-Spezifikation) spezifiziert drei Algorithmen zur Erzeugung von UUIDs:

  1. Mit IEEE 802 MAC Adressen als Quelle der Einzigartigkeit
  2. Pseudozufallszahlen verwenden
  3. Mit bekannter Saiten kombiniert mit kryptographischem Hashing

In allen Fällen wird der Seed-Wert mit dem Systemtakt und einem Taktsequenzwert kombiniert (um die Eindeutigkeit zu behalten, falls die Uhr rückwärts eingestellt wurde). Infolgedessen sind die UUIDs, die nach den oben genannten Mechanismen erzeugt werden, von allen anderen UUIDs, die belegt wurden oder werden, eindeutig.

Genommen von RFC 4122 Abstract :

Eine UUID ist 128 Bits lang und kann Einmaligkeit über Raum und Zeit garantieren.

Anmerkung: Aufgrund dieser Eindeutigkeitseigenschaft von UUIDS gibt es keine Überprüfung durch Django intern (wie von @FlipperPA erwähnt), um zu überprüfen, ob es bereits ein anderes Objekt mit dem gleichen uuid .

Nein, tut es nicht. Hier ist der relevante Teil des Codes von Django:

 def get_db_prep_value(self, value, connection, prepared=False): if isinstance(value, six.string_types): value = uuid.UUID(value.replace('-', '')) if isinstance(value, uuid.UUID): if connection.features.has_native_uuid_field: return value return value.hex return value 

Wie Sie sehen können, bei der Vorbereitung der Wert für die Datenbank, ruft es einfach uuid mit einem Ersetzen auf Bindestrichen; Es gibt keine Kontrolle für bestehende Einzigartigkeit. Das heißt, die UUIDField erbt von Class Field, die Djangos Modellen eindeutige Definition befolgen wird.

Django erzwingt nicht die Einzigartigkeit von UUIDs. Das ist, weil die wichtigsten Anwendungsfall für UUIDs ist es, eine Kennung, die erwartet werden kann, um einzigartig zu sein, ohne mit einer zentralen Behörde (wie eine Datenbank, was ist, was unique=True ist) zu überprüfen.

(Beachten Sie, dass UUIDs nicht garantiert werden, um einmalig zu sein, es gibt nur eine astronomisch kleine Chance auf eine Kollision .)

Sie können sicherlich die Datenbank verwenden, um die Einzigartigkeit auf die UUIDs zu erzwingen, wenn Sie wollen (indem Sie unique=True auf Ihrem Feld setzen), aber ich würde sagen, das ist eine ungewöhnliche und schwer zu rechtfertigende Konfiguration.

  • Pycharm - Autoload Modelle in Django Konsole
  • Wie kann ich ein StringIO-Objekt (Python und Django) ordnungsgemäß formatieren, um in eine Datenbank eingefügt zu werden?
  • Wie fügt man Post / Inhalt Lesezeit in einem Django Blog?
  • Followup: fehlt erforderlich Charfield in django Modelform wird als leere Zeichenfolge gespeichert und erhebt keinen Fehler
  • Django: OperationalError, wenn ich versuche, Benutzer von admin zu erstellen
  • Speichern von Wiki-Revisionen auf Google App Engine / Django - Ändern dieser vorhandenen Code
  • Django FileField im Modell maximale Rekursionstiefe überschritten beim Aufruf eines Python-Objekts
  • Hochladen eines Bildes durch Admin in Django
  • Django Dokumentation: Modelle; Fehler aus Zeile 1 des Codes
  • Wie kann ich jedes Objekt / Modell von einem anderen Django-Modell agnostisch verknüpfen?
  • Python Django-Helpdesk Fehler: Es konnte keine Verbindung hergestellt werden, weil die Zielmaschine sie aktiv ablehnte
  • Python ist die beste Programmiersprache der Welt.