繁体   English   中英

在queryset Django DRF中分别获取每个项目的计数

[英]Get count of each item separately in a queryset Django DRF

我的目标是获得与每个Department相关的Employee 例如,在1个部门中工作3名员工,在2个部门中工作另外2名员工。 我想出了如何获取所有Employee Employee.objects.values('department').annotate(emp_count_in_dep=Count('department')).order_by('department')所有Employee计数。

models.py

class Department(models.Model):
    dep_name = models.CharField(max_length=100)

    def __str__(self):
        return self.dep_name


class Employee(models.Model):
    emp_name = models.CharField(max_length=100)
    department = models.ForeignKey(Department, on_delete=models.CASCADE)

    def __str__(self):
        return self.emp_name

views.py

class DepartmentView(viewsets.ModelViewSet):

    queryset = Department.objects.all()
    serializer_class = DepartmentSerializer


class EmployeeView(viewsets.ModelViewSet):

    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializer

serializers.py

class DepartmentSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('dep_name', 'organization')
        model = Department

    def get_emp_count_for_dep(self, obj):
        emp_count_for_dep = Employee.objects.values('department').annotate(emp_count_in_dep=Count('department')).order_by('department')
        return emp_count_for_dep


class EmployeeSerializer(serializers.ModelSerializer):
    dep_count = serializers.SerializerMethodField()
    # emp_id = serializers.IntegerField(write_only=True)
    # emp_id = serializers.ReadOnlyField()
    emp_id = serializers.PrimaryKeyRelatedField(queryset=Employee.objects.all())

    class Meta:
        fields = ('emp_id', 'emp_name', 'department', 'dep_count')
        model = Employee

    def get_dep_count(self, obj, emp_id=emp_id):
        # dep_count = Department.objects.values('employee').get(pk=emp_id)
        dep_count = Department.objects.annotate(dep_count=Count('employee')).count()
        return dep_count

输出:

[
    {
        "dep_name": "second department",
        "emp_count_for_dep": [
            {
                "department": 1,
                "emp_count_in_dep": 3
            },
            {
                "department": 2,
                "emp_count_in_dep": 2
            }
        ]
    },
    {
        "dep_name": "first department",
        "emp_count_for_dep": [
            {
                "department": 1,
                "emp_count_in_dep": 3
            },
            {
                "department": 2,
                "emp_count_in_dep": 2
            }
        ]
    }
]

此代码为我提供了每个Department所有Employee count()的输出:

所需的输出:但是我需要第一个部门3个,第二个部门2个...

[
    {
        "dep_name": "first department",
        "emp_count_for_dep": [
            {
                "department": 1,
                "emp_count_in_dep": 3
            }
        ]
    },
    {
        "dep_name": "second department",
        "emp_count_for_dep": [
            {
                "department": 2,
                "emp_count_in_dep": 2
            }
        ]
    }
]

如您所见,我尝试了不同的方法(使用IntegerField和ReadOnlyField),也尝试了self.instance.pk =,因为我需要pk,因为我认为这有助于解决问题。 我希望重写get_dep_count可以对我有所帮助-例如添加一些参数,即pk (主键)。 我尝试了以前的dep_count定义(请看上面的注释行。我将其保留,因为它可能会帮助您帮助我)

如果您只想包括每个部门的员工人数,则可以替换此

class DepartmentSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('dep_name', 'organization')
        model = Department

    def get_emp_count_for_dep(self, obj):
        emp_count_for_dep = Employee.objects.values('department').annotate(emp_count_in_dep=Count('department')).order_by('department')
        return emp_count_for_dep

像这样

class DepartmentSerializer(serializers.ModelSerializer):

    emp_count_for_dep = serializers.SerializerMethodField()

    class Meta:
        fields = ('dep_name', 'organization', 'emp_count_for_dep')
        model = Department

    def get_emp_count_for_dep(self, obj):
        return Employee.objects.filter(department=obj).count()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM