JSON 序列化器和 Django 的替代 http 响应

Posted

技术标签:

【中文标题】JSON 序列化器和 Django 的替代 http 响应【英文标题】:JSON serialisers and alternative http responses with Django 【发布时间】:2018-07-09 17:07:35 【问题描述】:

我正在尝试在单击事件上创建过滤器系统 - 使用 AJAX 发布方法来更新模板上显示的上下文。

我目前正在使用:

return HttpResponse(json.dumps(context), content_type="application/json")

返回带有上下文对象的响应。但是,这不适用于某些对象类型:

TypeError: is not JSON serializable

我知道有一些关于序列化器的问题,但我目前无法 a.) 正确使用它们或 b.) 完全使用它们。

对于某些上下文,我使用 AJAX post 方法将过滤器变量传递给视图 - 然后:

posts = Post.published.filter(category__name__in=category_filter_items)

并将其添加到我的上下文中:

context['posts'] = posts

有人知道更新上下文的正确方法是这种方式吗?

【问题讨论】:

【参考方案1】:

首先,你应该知道,一旦Django模板被渲染,你不能在不重新渲染的情况下动态修改它的上下文。见template documentation。

在动态修改模板之前,您应该真正考虑一种过滤数据的方法,方法是调用一个视图,该视图使用您需要的上下文再次呈现模板。

选项 1:再次渲染模板

def my_view(request):
    posts = Posts.objects.all()
    # TODO: Filter the posts against the request
    template = loader.get_template('template.html')
    context = 
        'posts': posts,
    
    return HttpResponse(template.render(context, request))

选项 2:动态修改模板

如果您确定动态修改模板是您最好/唯一的选择,那么您有不同的方法来实现这一点。

其中之一是通过 jQuery 更改模板,加载由过滤视图呈现的子模板。看看this issue。

另一种方法是通过 JSON Api 获取过滤后的数据,并确保相应地更新您的模板。例如,您可能想要使用 Angular,它使用 MVVM architecture pattern。

如何在 Django 中序列化模型?

Django 提供serialization of models 作为核心功能。

将模型序列化为 JSON 非常简单:

from django.core.serializers import serialize

serialize('json', SomeModel.objects.all())

如果您需要实现具有模型序列化和过滤功能的 API,您可能需要使用 django-rest-framework。

【讨论】:

ValueError:视图 app.views.blogs 未返回 HttpResponse 对象。它返回 None 。 @MichaelRoberts 你返回响应了吗(返回 HttpResponse(context, content_type='application/json')? 我知道如何返回 json ...我想更新上下文 % for post in posts % 看看***.com/questions/35166013/…【参考方案2】:

使用 JsonResponse 代替 HttpResponse 怎么样?你还需要为 Post 模型定义一个序列化器。

【讨论】:

以上是关于JSON 序列化器和 Django 的替代 http 响应的主要内容,如果未能解决你的问题,请参考以下文章

django.core 序列化器和 Django Rest Framework 序列化器之间的区别

完全迷失:在 Django Rest 框架中使用序列化器和更新的多对多

利用fastjson反序列化json为对象和对象数组

PHP:对象数组 - 序列化与 json_encode - 替代方案?

Django AJAX

Django之ajax