首页 > 解决方案 > 查询集 Django

问题描述

这是我在 Django 中的观点:

class QuerySet1(generics.ListAPIView):
    """Количество приемов у каждого врача"""
    permission_classes = [permissions.AllowAny, ]

    def get_queryset(self):
        app_num = Appointment.objects.values('record__doctor').annotate(amount=Count("id"))
        app_num = list(app_num)
        print(app_num)
        return app_num
    serializer_class = QuerySet1Serializer

输出是:

[{'record__doctor': 1, 'amount': 1}, {'record__doctor': 4, 'amount': 5}, {'record__doctor': 5, 'amount': 2}]

这是序列化程序:

class QuerySet1Serializer(serializers.Serializer):
    amount = serializers.IntegerField()
    doctor = serializers.CharField(source='record__doctor')

    class Meta:
        model = Appointment
        fields = ("amount", "doctor")

当我运行代码时,它给了我下一个错误

AttributeError: 'dict' object has no attribute 'pk'

请帮忙!我该如何解决?谢谢

标签: jsondjangoapi

解决方案


试试这个,你可以annotate分组值,然后提取你想要的值

from django.db.models import F

qs = Appointment.objects.values('record__doctor').annotate(
       amount=Count("id"), doctor=F('record__doctor')
       ).values('amount', 'doctor')
         
# list(qs) would yield as follows, no need to use source
[{'doctor': 1, 'amount': 1}, {'doctor': 4, 'amount': 5}, {'doctor': 5, 'amount': 2}]


# serializer
class QuerySet1Serializer(serializers.Serializer):
    amount = serializers.IntegerField()
    doctor = serializers.CharField(source='record__doctor')

# view
class MylistView(generics.ListAPIView):
    """Количество приемов у каждого врача"""
    permission_classes = [permissions.AllowAny, ]

    def get_queryset(self):
        qs = Appointment.objects.values('record__doctor').annotate(
             amount=Count("id"), doctor=F('record__doctor')
             ).values('amount', 'doctor')
        return qs
    serializer_class = QuerySet1Serializer


推荐阅读