使用嵌套类序列化模型到json不会暴露嵌套类

使用嵌套类序列化模型到json不会暴露嵌套类

问题描述:

摘要:问题是我无法从序列化模型中的嵌套类访问缩略图图像,我不知道如何在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.thumbnail_image.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') 

我明白任何帮助,它已经阻止了我一天。

最佳关于下述

使用的版本:
的Django 1.3
PIL 1.1.7
Django的imagekit 0.3.6
simplejson 2.1.3

我无法弄清楚如何通过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) 

这是一种比干净的方法,但它现在工作。

+0

我也想不出 - 为什么 - 我想做这样的事情,我主要想到,有可能让JSON反映完整的对象结构。 – varl 2011-05-31 08:40:11

我认为你正在寻找像<img src="{{ product.photo.url }}"/>这样的结果,它正在加载你的图像的完整路径,如"/media/images/2013/photo_01.jpg"。使用JSON,您只有存储在数据库模型中的路径。

您可以做的是在模板中添加一些前缀,如<img src="media/{{ product.photo.url }}"/>