django - 如何在Django序列化程序响应中包含额外的数据?

标签 django json serialization

我正在尝试使用Django和jQuery进行实时搜索。我所做的是使Javascript使用getJSON函数请求一些数据,然后在Django中设置了一个 View ,该 View 返回由Django序列化程序自动执行的JSON响应。

而且效果很好,它会返回一个text/javascript content-type的json响应。为了避免发送所有数据,(这样做是我不需要的)我这样做了:
response.write(serializers.serialize("json", soknad_list, fields=('name', 'image', 'genre')))
但是,举例来说,“类型”字段是manyToMany字段,那么是否有可能从genre.all.0中获取值,而不仅仅是类型ID?

并且该模型具有函数get_absolute _url,是否可以在JSON响应中包含此函数(如果这样)?

所以我想我的问题是,是否可以在JSON响应中包含除原始字段数据以外的其他内容,如果没有,您将如何解决我的问题?

最佳答案

Django的JSON序列化基于simplejson,您可以直接使用它并随意扩展以处理任何类型的对象。因此,您在这里主要有两个选择:要么手动构建包含相关数据的字典列表,然后将其传递给simplejson.dumps()(默认情况下,它支持字符串,列表,字典和数字),或者编写自己的json编码器以了解如何序列化您的特定数据集。 FWIW,这是一个(尚未经过良好测试,但到目前为止已经可以使用的)Django模型感知的json编码器:

from django.utils import simplejson
from django.utils import datetime_safe
from django.utils.functional import Promise
from django.utils.translation import force_unicode
from django.utils.encoding import smart_unicode
from django.core.serializers.json import DjangoJSONEncoder

class ModelJSONEncoder(DjangoJSONEncoder):
    """
    (simplejson) DjangoJSONEncoder subclass that knows how to encode fields.

    (adated from django.serializers, which, strangely, didn't
     factor out this part of the algorithm)
    """
    def handle_field(self, obj, field):
        return smart_unicode(getattr(obj, field.name), strings_only=True)

    def handle_fk_field(self, obj, field):
        related = getattr(obj, field.name)
        if related is not None:
            if field.rel.field_name == related._meta.pk.name:
                # Related to remote object via primary key
                related = related._get_pk_val()
            else:
                # Related to remote object via other field
                related = getattr(related, field.rel.field_name)
        return smart_unicode(related, strings_only=True)

    def handle_m2m_field(self, obj, field):
        if field.creates_table:
            return [
                smart_unicode(related._get_pk_val(), strings_only=True)
                for related
                in getattr(obj, field.name).iterator()
                ]

    def handle_model(self, obj):
        dic = {}
        for field in obj._meta.local_fields:
            if field.serialize:
                if field.rel is None:
                    dic[field.name] = self.handle_field(obj, field)
                else:
                    dic[field.name] = self.handle_fk_field(obj, field)
        for field in obj._meta.many_to_many:
            if field.serialize:
                dic[field.name] = self.handle_m2m_field(obj, field)
        return dic

    def default(self, obj):
        if isinstance(o, Promise):
            return force_unicode(o)

        if isinstance(obj, Model):
            return self.handle_model(obj)

        return super(ModelJSONEncoder, self).default(obj)

高温超导

关于django - 如何在Django序列化程序响应中包含额外的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/413603/

相关文章:

Django Formset 覆盖为表以显示为网格

html - 最佳实践 : loading rendered html or json?

php - 使用 PHP 和 MySQL 生成 JSON 格式的表

java - 使用 snakeyaml 库在 Java 中将对象序列化为 YAML

c# - 基于用户角色的 ASP.NET WebAPI 条件序列化

c++ - 使用 boost 从二进制到 xml 序列化

python - Django update_or_create(获取部分)使用相关对象作为 kwarg

Django DateTimeField 显示为字符串

javascript - 谷歌地图从变量而不是文件显示 geoJSON

python - Django 1.8 使用 gmail SMTP 发送邮件