序列化器自定义查询集字段

问题描述 投票:0回答:1

有没有办法在调用查询集的序列化器中创建自定义字段? 这就是我正在尝试做的事情:

我有一个 Employee 序列化器,我想包含“last_attendance”字段。

class EmployeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Employee
        fields = ("id", 
                    "username", 
                    "first_name",
                    "last_name")

我想再添加一个字段“last_attendance”。 这是一个像这样的查询集:

"last_attendance" = Attendance.objects.filter(employee_id = id_of_that_employee).last()

更新:

供您参考,我正在尝试在此 REST api 中使用 EmployeeSerializer

queryset = Employee.objects.annotate(fullname=Concat('first_name', Value(' '), 'last_name'))
employee_list = queryset.filter(fullname__icontains=request.POST['search_string'], 
                                company=auth_employee.employee.company.id).order_by('id') 

page = request.GET.get('page', request.POST['page'])
paginator = Paginator(employee_list, request.POST['page_limit'])

try:
    employees = paginator.page(page)
except PageNotAnInteger:
    employees = paginator.page(request.POST['page'])
except EmptyPage:
    employees = []


serializer = EmployeeSerializer(list(employees), many=True)
data = serializer.data[:]
return Response(data, status=status.HTTP_200_OK)  

更新:

我发现可能相关,但还没有弄清楚如何应用Django Rest Framework - 如何在 ModelSerializer 中添加自定义字段

django django-rest-framework django-queryset serialization
1个回答
3
投票

使用

MethodField

class EmployeeSerializer(serializers.ModelSerializer):
    last_attendance = serializers.SerializerMethodField()

    class Meta:
        model = Employee
        fields = (
            "id",
            "username",
            "first_name",
            "last_name",
            "last_attendance",
        )

    def get_last_attendance(self, obj):
        attendance = Attendance.objects.filter(
            employee_id=id_of_that_employee
        ).last()
        if attendance:
            return (
                attendance.date
            )  # assuming it has this field
        else:
            return None

© www.soinside.com 2019 - 2024. All rights reserved.