Сериализация модели в json с вложенным классом не раскрывает вложенный класс - PullRequest
0 голосов
/ 14 апреля 2011

Сводка: Проблема в том, что я не могу получить доступ к миниатюрному изображению из вложенного класса в сериализованной модели и не знаю, как представить его в ответе 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 ]

0 голосов
/ 25 мая 2013

Я думаю, что вы ищете результат типа <img src="{{ product.photo.url }}"/>, который загружает полный путь к вашим изображениям, например "/media/images/2013/photo_01.jpg". С JSON у вас есть только путь, который хранится в вашей модели базы данных.

Что вы можете сделать, это добавить в шаблон какой-нибудь префикс, например <img src="media/{{ product.photo.url }}"/>.

0 голосов
/ 31 мая 2011

Я не мог понять, как выставить внутренний класс поверх 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)

Это не совсем чистый подход, но пока он работает.

...