Сериализация модели в json с вложенным классом не раскрывает вложенный класс
Описание: проблема в том, что я не могу получить доступ к миниатюрному изображению из вложенного класса в сериализованной модели, и я не знаю, как представить его в ответе JSON.
Описание: Я пытаюсь сериализовать свою модель Thing в JSON, и она работает каким-то образом. В ответ JSON я получаю следующее:
// JSON response
[
{
pk: 1
model: "base.thing"
fields: {
active: true
created_at: "2011-04-13 07:18:05"
num_views: 1
file: "things/5216868239_b53b8d5e80_b.jpg"
title: "ding ding ding"
}
}
]
Я только начал использовать django-imagekit, чтобы манипулировать изображениями Thing до размеров миниатюр, и он работает в обычном режиме, то есть при запуске thing.thumbnail_image.url в шаблоне возвращается правильный URL-адрес миниатюрного изображения.
Код песочницы, с которым я играюсь:
# base/models.py
from django.db import models
from imagekit.models import ImageModel
class Thing(ImageModel):
title = models.CharField(max_length=30)
file = models.ImageField(upload_to='things')
created_at = models.DateTimeField(auto_now_add=True)
active = models.BooleanField()
num_views = models.PositiveIntegerField(editable=False, default=0)
def __unicode__(self):
return self.title
class IKOptions:
spec_module = 'base.specs'
image_field = 'file'
save_count_as = 'num_views'
# base/views.py
from django.views.generic.base import View
from django.views.generic.list import MultipleObjectTemplateResponseMixin, ListView
from base.models import Thing
from django import http
from django.utils import simplejson as json
from utils import JsonResponse
class JSONResponseMixin(object):
def render_to_response(self, context):
"Returns a JSON response containing 'context' as payload"
return self.get_json_response(context)
def get_json_response(self, content, **httpresponse_kwargs):
"Construct an `HttpResponse` object."
return JsonResponse(content['thing_list']) # I can't serialize the content object by itself
class ThingsView(JSONResponseMixin, ListView):
model = Thing
context_object_name = "thing_list"
template_name = "base/thing_list.html"
def render_to_response(self, context):
if self.request.GET.get('format', 'html') == 'json':
return JSONResponseMixin.render_to_response(self, context)
else:
return ListView.render_to_response(self, context)
# base/specs.py
from imagekit.specs import ImageSpec
from imagekit import processors
class ResizeThumb(processors.Resize):
width = 100
height = 75
crop = True
class ResizeDisplay(processors.Resize):
width = 600
class EnchanceThumb(processors.Adjustment):
contrast = 1.2
sharpness = 1.1
class Thumbnail(ImageSpec):
access_as = 'thumbnail_image'
pre_cache = True
processors = [ResizeThumb, EnchanceThumb]
class Display(ImageSpec):
increment_count = True
processors = [ResizeDisplay]
# utils.py
from django.core.serializers import json, serialize
from django.db.models.query import QuerySet
from django.http import HttpResponse
from django.utils import simplejson
class JsonResponse(HttpResponse):
def __init__(self, object):
if isinstance(object, QuerySet):
content = serialize('json', object)
else:
content = simplejson.dumps(
object, indent=2, cls=json.DjangoJSONEncoder,
ensure_ascii=False)
super(JsonResponse, self).__init__(
content, content_type='application/json')
Я ценю любую помощь с этим, это блокирует меня на один день.
С наилучшими пожеланиями-
Использование версий:
Джанго 1,3
PIL 1.1.7
django-imagekit 0.3.6
simplejson 2.1.3
2 ответа
Я не мог понять, как выставить внутренний класс поверх JSON, поэтому я выбрал альтернативный способ сделать это: добавить django-imagekit и вручную изменить размер изображения до миниатюры и сохранить его в функции save() модели.
im = ImageOps.fit(im, (sizes['thumbnail']['width'], sizes['thumbnail']['height'],), method=Image.ANTIALIAS)
thumbname = filename + "_" + str(sizes['thumbnail']['width']) + "x" + str(sizes['thumbnail']['height']) + ".jpg"
im.save(fullpath + '/' + thumbname)
Это не совсем чистый подход, но пока он работает.
Я думаю, что вы ищете результат, как <img src="{{ product.photo.url }}"/>
который загружает полный путь к вашим изображениям, как "/media/images/2013/photo_01.jpg"
, С JSON у вас есть только путь, который хранится в вашей модели базы данных.
Что вы можете сделать, это добавить некоторый префикс в шаблоне, как <img src="media/{{ product.photo.url }}"/>
,