Python 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

我正在使用django 1.11:

  • 我有一个模型定义,用于计算外键属性上假值的数量,如下所示:
型号:

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”解析为字段。