Generieren Sie eine zufällige alphanumerische Zeichenfolge als Primärschlüssel für ein Modell

7

Ich möchte, dass ein Modell automatisch eine zufällige alphanumerische Zeichenfolge als Primärschlüssel generiert, wenn ich eine neue Instanz davon erstelle.

Beispiel:

%Vor%

In meinem Kopf sollte der Schlüssel ungefähr so ​​aussehen: "Ay3kJaBdGfcadZdao03293". Es ist für sehr temporären Gebrauch. Im Falle einer Kollision möchte ich, dass Django einen neuen Schlüssel versucht.

Ich habe mich gefragt, ob es da draußen schon etwas gibt oder eine sehr einfache Lösung, die ich nicht sehe (ich bin ziemlich neu bei Python und Django). Ansonsten dachte ich daran, meine eigene Version von models.AutoField zu machen, wäre das der richtige Ansatz?

Ich habe bereits gefunden, wie man den Schlüssel hier , es geht also nicht um die String-Generierung. Ich möchte nur, dass es nahtlos mit einem einfachen Django-Dienst zusammenarbeitet, ohne dem Code zu viel Komplexität hinzuzufügen.

BEARBEITEN: Mögliche Lösung? Was denkst du?

%Vor%

mit

%Vor%

Ich habe es gefunden, nachdem ich die Django-Dokumentation noch einmal durchgegangen bin.

    
ɭɘ ɖɵʊɒɼɖ 江戸 05.12.2013, 05:53
quelle

3 Antworten

4

So würde ich es machen, ohne das Feld zu einem Primärschlüssel zu machen:

%Vor%

Zwei Probleme, die dies im Vergleich zur Verwendung des Feldes als Primärschlüssel vermeidet, sind:

1) Djangos eingebaute Beziehungsfelder erfordern ganzzahlige Schlüssel

2) Django verwendet das Vorhandensein des Primärschlüssels in der Datenbank als Zeichen, dass save einen vorhandenen Datensatz aktualisieren soll, anstatt einen neuen einzufügen. Das bedeutet, wenn Sie eine Kollision in Ihrem Primärschlüsselfeld bekommen, überschreibt es automatisch, was sonst in der Zeile war.

    
Peter DeGlopper 05.12.2013, 06:44
quelle
13

Eine der einfachsten Methoden zum Generieren von eindeutigen Strings in Python ist die Verwendung von uuid module. Wenn Sie eine alphanumerische Ausgabe erhalten möchten, können Sie einfach auch die base64-Codierung verwenden:

%Vor%

Sie können diesen Code dann in die save -Methode des Modells einfügen oder ein benutzerdefiniertes Modellfeld mit diesem definieren.

    
Amir Ali Akbari 05.12.2013 06:05
quelle
2

Versuchen Sie Folgendes:

Die if-Anweisung unten stellt sicher, dass das Modell updatefähig ist.

Ohne die if-Anweisung aktualisieren Sie das ID-Feld jedes Mal, wenn Sie das Modell erneut speichern, und erstellen so jedes Mal ein neues Modell

%Vor%     
Angky William 14.06.2015 21:10
quelle

Tags und Links