Получить количество каждого элемента отдельно в наборе запросов Django DRF - PullRequest
1 голос
/ 10 июня 2019

Моя цель - узнать, сколько Employee относится к каждому Department. Например, в 1 отделе работают 3 сотрудника, в 2 отделе работают еще 2 сотрудника. Я понял, как получить все Employee для всех Employee.objects.values('department').annotate(emp_count_in_dep=Count('department')).order_by('department').

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
            }
        ]
    }
]

Этот код дает мне вывод из всех Employee count () для каждого Department:

Желаемый вывод: Но мне нужно 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 (посмотрите на строку комментария выше. Я оставляю это, потому что это может помочь вам помочь мне)

1 Ответ

2 голосов
/ 10 июня 2019

Если вам нужно только указать количество сотрудников на отдел, вы можете заменить это

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...