/ / Як JSON серіалізувати __dict__ моделі Django? - python, json, django, словник, django-1.7

Як JSON серіалізувати __dict__ моделі Django? - пітон, json, django, словник, django-1.7

Я хочу серіалізувати значення однієї моделі в Django. Тому що я хочу використовувати get(), values() недоступний. Проте я читаю у групах Google доступ до значень з __dict__.

from django.http import HttpResponse, Http404
import json
from customer.models import Customer

def single(request, id):
try:
model = Customer.objects.get(id=id, user=1)
except Customer.DoesNotExist:
raise Http404
values = model.__dict__
print(values)
string = json.dumps(values)
return HttpResponse(string, content_type="application/json")

Висновок друку виводить це.

{"_state": <django.db.models.base.ModelState object at 0x0000000005556EF0>, "web
site": "http://example.com/", "name": "Company Name", "id": 1, "logo": "", "use
r_id": 1, "address3": "City", "notes": "", "address2": "Street 123", "address1": "Company Name", "ustid": "AB123456789", "fullname": "Full Name Of Company Inc.", "mail": "contact@example.com"}

З-за _state Ключ, який містить несеріалізуемое значення, наступний рядок не виконує цю помилку.

<django.db.models.base.ModelState object at 0x0000000005556EF0> is not JSON serializable

Як я можу серіалізувати повернений словник __dict__ без _state включені?

Відповіді:

14 за відповідь № 1

model_to_dict() це те, що вам потрібно:

from django.forms.models import model_to_dict

data = model_to_dict(model)
data["logo"] = data["logo"].url
return HttpResponse(json.dumps(data), content_type="application/json")

Зазначивши fields і exclude Аргументи ключового слова можна керувати полями для серіалізації.

Також можна спростити try/except блокувати за допомогою ярлика get_object_or_404():

model = get_object_or_404(Customer, id=id, user=1)

1 для відповіді № 2

перевірити вихідний код django / core / serializers /__в цьому__.py коментар:

Interfaces for serializing Django objects.

Usage::

from django.core import serializers
json = serializers.serialize("json", some_queryset)
objects = list(serializers.deserialize("json", json))

To add your own serializers, use the SERIALIZATION_MODULES setting::

SERIALIZATION_MODULES = {
"csv" : "path.to.csv.serializer",
"txt" : "path.to.txt.serializer",
}

для одного об'єкта

json = serializers.serialize("json", some_queryset[0:1])

0 для відповіді № 3

Я дізнався, що це насправді можна використовувати values() разом з get(). Ви просто повинні отримувати значення з фільтрованого набору.

def single(request, id):
user = 1
try:
models = Customer.objects.filter(id=id, user=user)
values = models.values().get()
except Customer.DoesNotExist:
raise Http404
string = json.dumps(values)
return HttpResponse(string, content_type="application/json")