gpt4 book ai didi

python - 分别获取查询集中每个项目的计数 Django DRF

转载 作者:行者123 更新时间:2023-12-01 07:44:31 24 4
gpt4 key购买 nike

我的目标是获取与每个部门相关的Employee数量。例如,在 1 部门工作 3 名员工,在 2 部门工作另外 2 名员工。我想出了如何获取所有 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
}
]
}
]

这段代码为我提供了每个部门的所有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 定义(请查看上面的注释行。我保留它,因为它也许可以帮助您帮助我)

最佳答案

如果您只想包含每个部门的员 worker 数,您可以替换此内容

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()

关于python - 分别获取查询集中每个项目的计数 Django DRF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56527255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com