Django Benutzerdefiniertes Feld: Nur to_python () für Werte von DB ausführen?

8

Wie kann ich sicherstellen, dass die Methode * to_python () * meines benutzerdefinierten Felds nur aufgerufen wird, wenn die Daten in dem Feld aus der Datenbank geladen wurden?

Ich versuche, ein benutzerdefiniertes Feld zu verwenden, um die Base64 Encoding / Decoding einer einzelnen Modelleigenschaft zu behandeln. Alles schien korrekt zu funktionieren, bis ich eine neue Instanz des Modells instanziierte und diese Eigenschaft mit ihrem Klartextwert festlegte ... zu diesem Zeitpunkt versuchte Django das Feld zu entschlüsseln, scheiterte jedoch daran, dass es sich um Klartext handelte.

Der Reiz der Custom-Field-Implementierung war, dass ich dachte, dass ich dort 100% der Kodierungs- / Dekodierungslogik handhaben könnte, so dass kein anderer Teil meines Codes jemals darüber informiert werden musste. Was mache ich falsch?

(HINWEIS: Dies ist nur ein Beispiel, um mein Problem zu veranschaulichen, ich brauche keinen Rat, wie ich Base64 Encoding verwenden soll oder nicht)

%Vor%

... und es bricht, wenn ich das in der interaktiven Shell mache. Warum ruft es hier to_python () auf?

%Vor%

Ich hatte erwartet, dass ich so etwas tun könnte ...

%Vor%

... was mache ich falsch?

    
Adam Levy 22.12.2010, 14:28
quelle

3 Antworten

0

Erhalten Sie nur TypeError , wenn Sie dem Feld zuerst einen Wert zuweisen? Du könntest einfach einen Versuch schreiben / außer darum:

%Vor%

Es ist nicht die sauberste Lösung, aber Sie könnten es versuchen und sehen, ob es Ihnen erlaubt, mit dem Feld so zu arbeiten, wie Sie es erwarten.

    
girasquid 22.12.2010, 14:50
quelle
3

(aus Ссылка ) und Ссылка )

Es scheint, dass Sie in der Lage sein zu testen, ob es eine Instanz ist und das Problem damit ist, dass sie vom selben Typ sind (String vs B64 codierte Zeichenfolge). Wenn Sie den Unterschied nicht feststellen können, würde ich vorschlagen, Sie zu überzeugen immer:

%Vor%

oder

%Vor%

oder eine solche Codierung.

BEARBEITEN: - Ich habe Ссылка und dachte, du könntest etwas ähnliches machen.

    
James Khoury 09.08.2011 01:46
quelle
3

Ich habe genau das gleiche Problem, aber mit JSON-Daten. Ich möchte Daten in der Datenbank im JSON-Format speichern. Wenn Sie jedoch versuchen, ein bereits serialisiertes JSON-Objekt zu speichern, wird es deserialisiert zurückgegeben. Das Problem ist also, dass das, was reinkommt, nicht immer rauskommt. Insbesondere wenn Sie versuchen, eine Zahl als String zu speichern, wird sie als int oder float zurückgegeben, da sie vor dem Speichern von to_python deserialisiert wird.

Die Lösung ist einfach, wenn auch nicht zu elegant. Speichern Sie einfach den "Typ" der Daten zusammen mit den Daten, in meinem Fall handelt es sich um JSON-Daten, also gebe ich ihm "json:" voran und weiß so immer, ob die Daten aus der Datenbank kommen.

%Vor%

Es ist allerdings ärgerlich, dass Sie kein konsistentes Verhalten erwarten können oder dass Sie nicht sagen können, ob to_python mit einem benutzerdefinierten Wert oder einem Wert aus der Datenbank arbeitet.

    
zeraien 05.10.2011 23:02
quelle

Tags und Links