Django Modell-Deserialisierung mit leerer PK

8

Ich habe mein Django-Modell serialisiert:

%Vor%

und bekam diese Ausgabe:

%Vor%

So können Sie sehen, ich habe pk="133":

Und jetzt will ich dies wieder in das django Modell deserialisieren und save () in die Datenbank, aber mit einem anderen pk, so dass es einen neuen Datensatz mit einer neuen ID erzeugen sollte.

Ich versuche, XML zu analysieren und pk mit:

zu ändern
  • pk="" - Parser beschwert sich, dass pk integer sein sollte
  • pk="- 1" oder "0" - erstellt tatsächlich einen Datensatz mit id / pk="1" oder "0"
  • pk="None" oder None oder "null" - Parser beschwert sich, dass pk integer
  • sein sollte
  • Entfernen Sie das Attribut "pk" - der Parser beschwert sich, dass das Attribut obligatorisch ist

In Django Serialisierung Artikel gibt es ein Beispiel, wie aus JSON mit null "pk" deserialisiert werden kann .

%Vor%

(Es ist eigentlich für 0,96, aber ich gehe davon aus, dass es auch für 1. * funktionieren sollte)

In JSON kann pk also null sein, aber in XML beschwert es sich. Wie setze ich pk für XML auf null?

Danke

    
zinovii 16.07.2009, 01:15
quelle

1 Antwort

5

Sieht in Django wie ein Bug aus. Es gibt keine Möglichkeit, leeres (oder null / None) "pk" für serialisiertes XML-Objekt anzugeben.

Von django / core / serializers / xml_serializer.py:

%Vor%

Wenn das pk-Attribut fehlt, wird eine Ausnahme ausgelöst. Also müssen wir etwas pk zur Verfügung stellen.

Von django / models / fields / init .py

%Vor%

Wenn pk nicht ganzzahlig ist - auch Ausnahme.

Es sieht so aus, als ob es keine Möglichkeit gibt, ein leeres pk bereitzustellen.

Abhilfe könnte sein:

  1. bekomme maximale ID von MyModel
  2. id + = 1
  3. setze "pk" in meinem XML mit neuer ID
  4. deserialize in model
  5. speichern ()

Es ist ein bisschen knifflig, weil in den Schritten 1-5 die Tabelle gesperrt sein sollte ... irgendwie ... um Kollisionen zu vermeiden.

BEARBEITEN:

Problemumgehung ist:

  1. Setze pk="999999" (irgendein temporärer ganzzahliger Wert)
  2. Während der Iteration setzen Sie id und pk auf None und später auf save ()

    mymodels_iterator = serializers.deserialize ("xml", fixed_pk_serialized_xml_model)

    für mein Modell in mymodels_iterator:

    %Vor%

Und es funktioniert!

Danke an Evgenys Kommentar zur clone () Methode.

    
zinovii 16.07.2009 02:02
quelle

Tags und Links