如何反转QuerySet且不触发AttributeError: 'reversed'对象无values属性
解决AttributeError反转QuerySet的问题
方法1:数据库层面直接反转排序
要反转已取出的3条数据顺序,直接调整查询逻辑,让数据库返回反转后的结果,这样reversed_instances还是QuerySet,能正常调用values():
def view(request, pk): instances = Calls.objects.filter(var=var).order_by('-date')[:3] # 用已获取实例的id重新查询,按date正序实现反转 reversed_instances = Calls.objects.filter(id__in=[obj.id for obj in instances]).order_by('date') return JsonResponse({"calls": list(reversed_instances.values())})
方法2:本地处理后模拟QuerySet
不想多查一次数据库的话,先拿到values数据再反转,然后给反转后的列表套个有values()方法的壳:
def view(request, pk): instances = Calls.objects.filter(var=var).order_by('-date')[:3].values() reversed_values = list(reversed(instances)) # 写个简单类模拟QuerySet的values方法 class MockQuerySet: def values(self): return reversed_values reversed_instances = MockQuerySet() return JsonResponse({"calls": list(reversed_instances.values())})
方法3:切片反转+快速封装
用切片直接反转values列表,再用动态类型快速生成带values()方法的对象:
def view(request, pk): instances = Calls.objects.filter(var=var).order_by('-date')[:3].values() reversed_list = list(instances)[::-1] # 动态创建对象,让它有values方法返回反转后的列表 reversed_instances = type('MockQS', (), {'values': lambda self: reversed_list})() return JsonResponse({"calls": list(reversed_instances.values())})
注释
报错是因为reversed()返回的是迭代器,不是Django QuerySet,自然没有values()方法。上面三种方法都保证了reversed_instances能调用values(),完全不用修改原代码里reversed_instances.values()这部分写法。
内容的提问来源于stack exchange,提问作者coderDcoder
相关产品推荐
相关产品推荐

