【问题标题】:How can I render only the attributes of my model in returned JSON?如何在返回的 JSON 中仅呈现模型的属性?
【发布时间】:2020-01-03 20:55:39
【问题描述】:

我正在使用 Python 3.7 和 Django。我有一个返回以下内容的视图

# Ajax request that returns articles with similar words in the titles
def get_hints(request):
    ...
    s = ArticlesService()
    objects = s.get_hints(article)
    data = serializers.serialize('json', objects)
    return HttpResponse(data, content_type="application/json")

“get_hints”方法返回一个模型对象数组。问题是,在 Javascript 端,JSON 是这样返回的......

[{model: "mydb.article", pk: 60945, fields: { title: "Cooking Eggplant", path: "https://thecookingblog.com/abcde", label: "" },
    ...]

有没有办法在没有“模型”和“字段”的情况下返回 JSON,而只是将对象的属性作为更传统的 JSON 返回,例如

{ title: "Cooking Eggplant", path: "https://thecookingblog.com/abcde", label: "" }

?

【问题讨论】:

  • 是的,使用另一个序列化器,Django 提供的序列化器用于导出和加载数据库中的数据。 django-rest-framework 有你想要的序列化器。
  • @dirkgroten,在您列出的答案中,他们正在从头开始构建 JSON,一次一个属性。如果这是唯一的方法,那就这样吧,但我希望有一些东西我可以将一个对象传递给它,以便为我做所有的艰苦工作。
  • 然后参考我的第一条评论。使用 DRF 中的 ModelSerializer。
  • 那个东西叫做序列化器。要么找到一个 Django 包,它具有易于配置和灵活的序列化器(DRF 有),要么编写你自己的序列化器类。下面 Abdul 的答案是构建一个简单的序列化器的良好开端,它将序列化您模型的所有字段。

标签: python json django python-3.x view


【解决方案1】:

是的。 Serializer 类的get_dump_object 方法负责以下格式

{
    "pk": "pk_val",
    "model": "model_name",
    "fields": {
        "model_field": "model_field_value",
        ...
    }
}

以下是get_dump_object 方法的当前实现。

def get_dump_object(self, obj):
    data = OrderedDict([('model', str(obj._meta))])
    if not self.use_natural_primary_keys or not hasattr(obj, 'natural_key'):
        data["pk"] = self._value_from_field(obj, obj._meta.pk)
    data['fields'] = self._current
    return data

由于您不需要 pkmodel 字段,您可以创建自己的序列化程序类并覆盖 get_dump_object 方法。

from django.core.serializers.json import Serializer as JSONSerializer

class MyCustomSerializer(JSONSerializer):
    def get_dump_object(self, obj):
        return self._current

然后就可以得到如下格式的数据了

[{ title: "Cooking Eggplant", path: "https://thecookingblog.com/abcde", label: "" }, ....]

通过调用其serialize 方法。

data = MyCustomSerializer().serialize(objects)
return HttpResponse(data, content_type="application/json")

【讨论】:

  • 我不介意拥有 pk,我只是希望将对象表示为单个 JSON 实体,而不是现在的方式。我还需要编写自定义函数来转储该数据吗?
  • 如果你想要“pk”,那么你可以做self._current而不是返回data = super().get_dump_object(obj); return {'pk': data['pk'], **data['fields']}
  • 我在哪里写的?在你有的自定义函数中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多