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

带分页的Django API列表-页面不可JSON序列化,第1张

带分页的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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5648311.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存