如何在不使用视图集的情况下序列化 Django 中的注释字段?
Posted
技术标签:
【中文标题】如何在不使用视图集的情况下序列化 Django 中的注释字段?【英文标题】:How to serialize annotated field in Django WITHOUT using viewsets? 【发布时间】:2021-01-23 02:43:24 【问题描述】:我有一个带注释的字段,我试图将其包含在对 AJAX 获取请求的响应中。代码:
后端:
def ajax_get_tags(request):
if request.is_ajax():
data = json.dumps(
serializers.serialize("json", Tag.objects.annotate(word_count=Count('words')).order_by('-word_count'),
fields=('text', 'is_game')))
else:
data = 'fail'
mimetype = 'application/json'
return HttpResponse(data, mimetype)
前端:
$.getJSON("% url 'get_all_tags' %", function (result)
result = JSON.parse(result);
);
如何将字数统计发送到前端?我找到了Aggregate (and other annotated) fields in Django Rest Framework serializers,但我不想将我的端点转换为视图集
【问题讨论】:
【参考方案1】:首先确保您已安装 DRF(Django Rest 框架)。
serializers.py:
from rest_framework import serializers
from .models import Tag
class TagSerializer(serializers.ModelSerializer):
word_count = serializers.IntegerField()
class Meta:
model = Tag
fields = ('text', 'is_game', 'word_count')
views.py
from rest_framework.renderers import JSONRenderer
from .serializers import TagSerializer
def ajax_get_tags(request):
if request.is_ajax():
qs = Tag.objects.annotate(word_count=Count('words')).order_by('-word_count')
serializer = TagSerializer(qs, many=True)
data = JSONRenderer().render(serializer.data)
else:
data = 'fail'
mimetype = 'application/json'
return HttpResponse(data, mimetype)
前端:(无需json解析)
$.getJSON("% url 'get_all_tags' %", function (result)
console.log(result);
);
请注意,与 django 核心序列化程序相比,一些信息会丢失(pk 等),但您可能并没有使用它
【讨论】:
以上是关于如何在不使用视图集的情况下序列化 Django 中的注释字段?的主要内容,如果未能解决你的问题,请参考以下文章
python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)
python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)