我刚刚尝试重新创建它,并且看到了几种解决方法。
首先,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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)