栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

带分页的Django API列表-页面不可JSON序列化

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

带分页的Django API列表-页面不可JSON序列化

我刚刚尝试重新创建它,并且看到了几种解决方法。

首先,JSON将无法解析Page对象或该

page.object_list
属性基础的QuerySet 。它会说
"Object of type'Employee' is not JSON serialisable"

因此,要解决此问题,我将尝试:

employee_list = Employee.objects.filter(company = auth_employee.employee.company.id).values().order_by('id')page = request.GET.get('page', request.POST['page'])paginator = Paginator(employee_list, request.POST['page_limit'])try:    employees = paginator.page(page)except PageNotAnInteger:    employees = paginator.page(request.POST['page'])except EmptyPage:    employees = paginator.page(paginator.num_pages)return Response(list(employees) ,status=status.HTTP_200_OK)

首先,我们

.values()
在雇员查询集上使用,因为此调用的结果ValuesQuerySet可以用解析
list(employees)
。在Page类内部,他们以这种方式评估实例内部的对象列表,然后返回任何结果。

最后,由于JSON无法序列化Page类,因此我们只需调用

list(Page)
返回一个列表即可。之所以
__getitem__
可行,是因为Page实现并返回了底层的object_list。

另外,您可能会发现某些数据类型将引发JSON序列化错误(

values()
将为DateTime字段返回DateTime对象)。在测试中,我遇到了一个问题
Objectof type 'datetime' is not JSONserializable
。如果发生这种情况,则需要使用其他JSON编码器或扩展自己的JSON编码器。DjangoJSONEnprer可以在django.core.serializers.json.DjangoJSONEnprer中找到,并处理django中的日期时间,uuid,十进制和其他常见数据类型。

编辑::您提到的模型代码为:

class Employee(models.Model):    user = models.oneToOneField(User, on_delete=models.CASCADE, related_name='employee')    company = models.ForeignKey(Company)    username = models.CharField(max_length=30, blank=False)    email = models.CharField(max_length=30, blank=False)    first_name = models.CharField(max_length=30, blank=False)    last_name = models.CharField(max_length=30, blank=False)    created_at = models.DateTimeField(auto_now_add=True)    updated_at = models.DateTimeField(auto_now=True)    def __str__(self):        return self.user.username    def as_dict(self):        return {"id": "%d" % self.id,     "company": self.company.as_dict(),     "username": self.username if self.username else "",     "email": self.email if self.email else "",     "first_name": self.first_name if self.first_name else "",     "last_name": self.last_name if self.last_name else "",     "tel":self.tel if self.tel else "",         "created_at":self.created_at.strftime('%Y-%m-%d %H:%M'),     "updated_at":self.updated_at.strftime('%Y-%m-%d %H:%M')}

因为您具有这种

as_dict
方法,所以我们可以使用它来呈现您的员工的表示形式,而不必依赖
.values()
。方法如下:

employee_list = Employee.objects.filter(company = auth_employee.employee.company.id).order_by('id')page = request.GET.get('page', request.POST['page'])paginator = Paginator(employee_list, request.POST['page_limit'])try:    employees = paginator.page(page)except PageNotAnInteger:    employees = paginator.page(request.POST['page'])except EmptyPage:    employees = paginator.page(paginator.num_pages)#  Here we map a lambda function over the queryset of Models to return the dictionary representation for each element in the listemployees_page = list(    map(lambda employee: employee.as_dict(), list(employees)))return Response(employees_page ,status=status.HTTP_200_OK)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/646110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号