Python Django 1.11订单结果问题-注释计数返回错误值
我正在使用django 1.11:Python Django 1.11订单结果问题-注释计数返回错误值,python,django,Python,Django,我正在使用django 1.11: 我有一个模型定义,用于计算外键属性上假值的数量,如下所示: 型号: class Model(models.Model): . . . def count_total(self): return self.anothermodel_set.filter(val=False).count() class ModelViewSet(viewsets.ReadOnlyModelViewSet): qu
- 我有一个模型定义,用于计算外键属性上假值的数量,如下所示:
class Model(models.Model):
.
.
.
def count_total(self):
return self.anothermodel_set.filter(val=False).count()
class ModelViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Model.objects.all()
serializer_class = ModelSerializerClass
permissions = AuthenticatedReadOnly
pagination_class = StandardResultsSetPagination
def list(self, request):
queryset = Model.objects.all()
# Attempt 1: returns wrong count
queryset = queryset.annotate(a_count=Count(Case(When(anothermodel__val=False, then=1), default=0, output_field=IntegerField())))
# Attempt 2: returns wrong count, same as attempt 1
queryset = queryset.annotate(b_count=Count(Q(anothermodel__val=False)))
# ideally I want to do
queryset = queryset.order_by('count_total')
查看:
class Model(models.Model):
.
.
.
def count_total(self):
return self.anothermodel_set.filter(val=False).count()
class ModelViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Model.objects.all()
serializer_class = ModelSerializerClass
permissions = AuthenticatedReadOnly
pagination_class = StandardResultsSetPagination
def list(self, request):
queryset = Model.objects.all()
# Attempt 1: returns wrong count
queryset = queryset.annotate(a_count=Count(Case(When(anothermodel__val=False, then=1), default=0, output_field=IntegerField())))
# Attempt 2: returns wrong count, same as attempt 1
queryset = queryset.annotate(b_count=Count(Q(anothermodel__val=False)))
# ideally I want to do
queryset = queryset.order_by('count_total')
当我按count\u total
排序时,我会给出
/api/端点处的字段错误/
无法将关键字“count\u total”解析到字段中
序列化程序:
在我的序列化程序中,我已将修改为\u represantation
定义以进行调试:
def to_representation(self, instance):
return {'id': instance.pk, 'a_count': instance.a_count, 'b_count' : instance.b_count, 'correct_count': instance.count_total()}
否则,在我的序列化程序中,我有:
class Meta:
model = Model
fields = ('id', 'title', 'bunch-of-other-stuff', 'count_total')
instance.count\u total()
返回正确的结果,但我不能简单地将其作为视图中的queryset.order\u by('count\u total')
来对结果进行排序,而不使用注释
有什么问题吗?我不确定这是否是您的问题,但模型定义似乎未使用,因为您只是进行计算,没有返回值。应该是:
def count_total(self):
return self.anothermodel_set.filter(val=False).count()
我还不明白为什么在模型和视图中都会发生计算。可以使用模型定义,也可以对查询集进行注释,但不需要同时执行这两项操作。如果选择模型定义路线,则视图应如下所示:
class ModelViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Model.objects.all()
serializer_class = ModelSerializer
permissions = AuthenticatedReadOnly
pagination_class = StandardResultsSetPagination
def list(self, request):
queryset = self.queryset.order_by('count_total')
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
print(str(queryset))
如果使用模型定义,则需要在序列化程序中设置只读属性:
count_total = serializers.ReadOnlyField(allow_null=True)
class Meta:
model = Model
fields = ('id', 'title', 'bunch-of-other-stuff', 'count_total')
如果仍然出现“无法将计数总数解析为字段”错误,请在运行序列化程序之前,向视图集中抛出一条打印语句,如下所示:
class ModelViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Model.objects.all()
serializer_class = ModelSerializer
permissions = AuthenticatedReadOnly
pagination_class = StandardResultsSetPagination
def list(self, request):
queryset = self.queryset.order_by('count_total')
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
print(str(queryset))
问题可能在于如何过滤模型定义。感谢您的回复,很抱歉这是我的错误。实际上,我正在返回count_total def,我现在更新了上面的问题-一定是在最初键入时留下的。设置ready\u only serializer属性是什么意思?是不是像
count\u total=serializers.ReadOnlyField()
?是的,这正是我的意思。你的ModelSerializerClass上有吗?我刚刚编辑了我的答案以包含正确的序列化程序代码。在粘贴的代码中,缺少只读字段。您遇到了什么错误?FieldError位于/api/endpoint/无法将关键字“count\u total”解析为字段。