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\\\\\\"}\\""'
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? –
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
Tatsächlich ist es bereits ein offenes Problem in diesem Projekt https://github.com/jjkester/django-auditlog/issues/71 – mikestef9