2017-03-13 1 views
2

Umwelt:Warum gibt Django den JSONField-Wert als Zeichenfolge zurück?

  • Django 1.10.6
  • psycopg2 2.7.1
  • PostgreSQL über Homebrew installiert 9.6.2 auf macOS Sierra
  • Python 3.6.0 via Homebrew installiert

Beispielmodell:

from django.db import models 
from django.contrib.postgres.fields import JSONField 


class Foo(models.Model): 
    data = JSONField() 

Wenn ich versuche, ein Objekt zu erstellen, funktioniert alles wie erwartet:

from myapp.models import Foo 
x = Foo() 
x.data = {'key1': 'value1'} 
x.save() 

und Abfrage funktioniert wie erwartet:

Foo.objects.filter(data__key1='value1').count() 
# 1 

Allerdings, wenn ich versuchen, die Daten aus dem Objekt abzurufen, den Wert des .data Attribut ist ein String:

from myapp.models import Foo 
x = Foo.objects.get(id=1) 
x.data 
# '{"key1": "value1"}' 
type(x.data) 
# str 

ich ein dict erwarten würde hier kommen. Das Problem wird rekursiv schlimmer, wenn sie versuchen, das Objekt zu speichern zurück

x.save() 
x = Foo.objects.get(id=1) 
x.data 
# '"{\\"key1\\": \\"value1\\"}"' 
x.save() 
x = Foo.objects.get(id=1) 
x.data 
# '"\\"{\\\\\\"key1\\\\\\": \\\\\\"value1\\\\\\"}\\""' 
+0

Das sollte nicht passieren. Können Sie Ihr komplettes Modell zeigen? Haben Sie Validatoren, eine benutzerdefinierte Speichermethode oder Signale, die an das Speicherereignis angehängt sind? –

+3

Ich fing an, rückwärts von anderen installierten Apps zu arbeiten, die ich in meinem Projekt hatte und fand den Täter, diese Anwendung https://github.com/jjkester/django-auditlog zu sein. Wenn ich es von MIDDLEWARE und INSTALLED_APPS entfernte, funktioniert alles wie erwartet. Wenn man genauer hinsieht, benötigt dieses Projekt django-jsonfield und es muss eine Inkompatibilität zwischen den beiden geben. – mikestef9

+0

Tatsächlich ist es bereits ein offenes Problem in diesem Projekt https://github.com/jjkester/django-auditlog/issues/71 – mikestef9

Antwort

Verwandte Themen