Lingkungan Hidup:

  • Django 1.10.6
  • psycopg2 2.7.1
  • PostgreSQL 9.6.2 diinstal melalui Homebrew di macOS Sierra
  • Python 3.6.0 diinstal melalui Homebrew

Contoh model:

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


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

Ketika saya mencoba membuat objek, semuanya berfungsi seperti yang diharapkan:

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

Dan kueri berfungsi seperti yang diharapkan:

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

Namun, ketika saya mencoba mengambil data itu dari objek, nilai atribut .data adalah string:

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

Saya berharap untuk mendapatkan kembali dict di sini. Masalahnya menjadi lebih buruk secara rekursif ketika mencoba menyimpan kembali objek

x.save()
x = Foo.objects.get(id=1)
x.data
# '"{\\"key1\\": \\"value1\\"}"'
x.save()
x = Foo.objects.get(id=1)
x.data
# '"\\"{\\\\\\"key1\\\\\\": \\\\\\"value1\\\\\\"}\\""'
7
mikestef9 13 Maret 2017, 22:00

2 jawaban

Jawaban Terbaik

Ternyata Anda tidak dapat menggunakan Django-jsonfield dan JSONField asli Django dalam proyek yang sama atau apakah Anda akan mengalami perilaku aneh seperti yang dijelaskan dalam pertanyaan

https://bitbucket.org/schinckel/django-jsonfield/issues/57/cannot-use-in-the-same-project-as-djangos

11
mikestef9 13 Maret 2017, 20:09

Bagi saya masalahnya adalah bahwa database dibuat dari cadangan dan jenis kolom disetel ke text padahal seharusnya json atau jsonb.

Membersihkan json yang tidak valid lalu mengubah jenis kolom dengan yang berikut:

ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::text::jsonb;

(terima kasih kepada https://stackoverflow.com/a/28076909/2362877)

2
frmdstryr 14 Agustus 2019, 21:15