Wie speichern Sie Django-Objekte als Sitzungsvariablen (Objekt ist nicht JSON-serialisierbar)?

8

Ich habe eine einfache Ansicht

%Vor%

Für den obigen Code bekomme ich den Fehler

%Vor%

Django Version 1.6.2. Was mache ich falsch ?

    
Akash Deshpande 10.03.2014, 07:57
quelle

5 Antworten

1
___ qstntxt ___

Ich habe eine einfache Ansicht

%Vor%

Für den obigen Code bekomme ich den Fehler

%Vor%

Django Version 1.6.2. Was mache ich falsch ?

    
___ answer22294933 ___

In einem Cookie würde ich nur den Primärschlüssel des Objekts speichern:

%Vor%

Wenn Sie die Karte aus der Sitzung laden, besorgen Sie sich die Karte erneut mit:

%Vor%

, die %code% auf %code% setzt, wenn in der Sitzung kein %code% -Eintrag vorhanden ist oder die bestimmte Karte nicht existiert.

    
___ answer45437603 ___

In Django können Sie mit Sitzung und Ctypes Folgendes tun:

%Vor%     
___ antwort2295093 ___

@Martijn ist oder könnte die richtige Methode zum Speichern des Objekts in Sitzungsvariablen sein.

Aber das Problem wurde gelöst, indem wir zurück zu Django 1.5 gingen. Dieses Problem ist speziell für django 1.6.2.

Hoffe, das hilft.

    
___ qstnhdr ___ Wie speichern Sie Django-Objekte als Sitzungsvariablen (Objekt ist nicht JSON-serialisierbar)? ___ tag123django ___ Django ist ein serverseitiges Open-Source-Webanwendungs-Framework, das in Python geschrieben wurde. Es wurde entwickelt, um den Aufwand für die Erstellung komplexer datengesteuerter Websites und Webanwendungen zu reduzieren, mit besonderem Fokus auf weniger Code, keine Redundanz und expliziter als implizit. ___ answer22295866 ___

Es gibt zwei einfache Möglichkeiten, dies zu tun.

  • Wenn jedes Objekt gleichzeitig zu einer Sitzung gehört, speichern Sie die Sitzungs-ID als Modellfeld und aktualisieren Sie die Modelle.
  • Wenn ein Objekt gleichzeitig mehreren Sitzungen angehören kann, speichern Sie object.id als Sitzungsvariable.
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ answer32906635 ___

Leider funktioniert die vorgeschlagene Antwort nicht, wenn das Objekt kein Datenbankobjekt ist, sondern eine andere Art von Objekt - etwa datetime oder eine Objektklasse Foo (object): pass, das kein Datenbankmodellobjekt ist.

Sicher, wenn das Objekt zufällig ein ID-Feld hat, können Sie das ID-Feld in der Datenbank speichern und den Wert von dort nachschlagen, aber im Allgemeinen hat es vielleicht keinen so einfachen Wert und die einzige Möglichkeit besteht darin, die Daten zu konvertieren so zu stringeln, dass Sie diese Zeichenfolge lesen und das Objekt basierend auf den Informationen in der Zeichenfolge rekonstruieren können.

Im Fall eines Datetime-Objekts wird dies dadurch erschwert, dass ein naives Datetime-Objekt zwar das Format% Z ausgeben kann, indem es einfach nichts druckt, das strptime -Objekt aber das Format% Z nicht lesen kann, wenn es nichts gibt wird ersticken, es sei denn, es gibt dort eine gültige Zeitzonenspezifikation - wenn Sie also ein Datetime-Objekt haben, das ein TZInfo-Feld enthalten kann oder nicht, müssen Sie einmal zweimal mit% Z und zweimal ohne Z%. Das ist dumm. Es wird noch weniger durch die Tatsache gemacht, dass Datetime-Objekte eine fromtimestamp-Funktion haben, aber keine totimestamp-Funktion, die einheitlich einen Zeitstempel erzeugt, den vontimestamp liest. Wenn es einen Format-Code gibt, der die Nummer des Zeitstempels erzeugt, die ich nicht gefunden habe und wieder, leiden strftime / strptime unter der Tatsache, dass sie nicht wie oben beschrieben symmetrisch sind.

    
___
Akash Deshpande 10.03.2014, 08:17
quelle
11

In einem Cookie würde ich nur den Primärschlüssel des Objekts speichern:

%Vor%

Wenn Sie die Karte aus der Sitzung laden, besorgen Sie sich die Karte erneut mit:

%Vor%

, die card auf None setzt, wenn in der Sitzung kein card -Eintrag vorhanden ist oder die bestimmte Karte nicht existiert.

    
Martijn Pieters 10.03.2014 08:05
quelle
3

Es gibt zwei einfache Möglichkeiten, dies zu tun.

  • Wenn jedes Objekt gleichzeitig zu einer Sitzung gehört, speichern Sie die Sitzungs-ID als Modellfeld und aktualisieren Sie die Modelle.
  • Wenn ein Objekt gleichzeitig mehreren Sitzungen angehören kann, speichern Sie object.id als Sitzungsvariable.
kdani 10.03.2014 09:03
quelle
2

Leider funktioniert die vorgeschlagene Antwort nicht, wenn das Objekt kein Datenbankobjekt ist, sondern eine andere Art von Objekt - etwa datetime oder eine Objektklasse Foo (object): pass, das kein Datenbankmodellobjekt ist.

Sicher, wenn das Objekt zufällig ein ID-Feld hat, können Sie das ID-Feld in der Datenbank speichern und den Wert von dort nachschlagen, aber im Allgemeinen hat es vielleicht keinen so einfachen Wert und die einzige Möglichkeit besteht darin, die Daten zu konvertieren so zu stringeln, dass Sie diese Zeichenfolge lesen und das Objekt basierend auf den Informationen in der Zeichenfolge rekonstruieren können.

Im Fall eines Datetime-Objekts wird dies dadurch erschwert, dass ein naives Datetime-Objekt zwar das Format% Z ausgeben kann, indem es einfach nichts druckt, das strptime -Objekt aber das Format% Z nicht lesen kann, wenn es nichts gibt wird ersticken, es sei denn, es gibt dort eine gültige Zeitzonenspezifikation - wenn Sie also ein Datetime-Objekt haben, das ein TZInfo-Feld enthalten kann oder nicht, müssen Sie einmal zweimal mit% Z und zweimal ohne Z%. Das ist dumm. Es wird noch weniger durch die Tatsache gemacht, dass Datetime-Objekte eine fromtimestamp-Funktion haben, aber keine totimestamp-Funktion, die einheitlich einen Zeitstempel erzeugt, den vontimestamp liest. Wenn es einen Format-Code gibt, der die Nummer des Zeitstempels erzeugt, die ich nicht gefunden habe und wieder, leiden strftime / strptime unter der Tatsache, dass sie nicht wie oben beschrieben symmetrisch sind.

    
Alf 02.10.2015 11:54
quelle
2

In Django können Sie mit Sitzung und Ctypes Folgendes tun:

%Vor%     
Slipstream 01.08.2017 12:19
quelle

Tags und Links