首页 > 解决方案 > Django Rest Framework:序列化 id 列表

问题描述

有没有办法像{'ids': [1,2,3]}主键的 ListField 一样序列化请求的有效负载(即通过序列化程序检查具有此类 id 的 Task 对象是否存在)?

或者我应该使用什么方法为另一个微服务编写 API 视图以确认任务已入队?

serializer = ConfirmationSerializer(
    data=request.data, many=True
)
queryset = Task.objects.filter(
    ids_in=serializer.data.ids,
    status=Task.STATUS_CREATED,
)

queryset.update(
    status=Task.STATUS_SENT,
    confirmed_at=dt.datetime.now()
)
return Response({'status': 'ok'})

标签: pythondjangodjango-rest-framework

解决方案


PrimaryKeyRelatedField可用于序列化主键列表。只需传递queryset参数来验证字段输入和内部create方法,您就可以访问Task要更新的对象列表

class ConfirmationSerializer(Serializer):
    tasks_ids = PrimaryKeyRelatedField(
        many=True, 
        queryset=Task.objects.filter(status=Task.STATUS_CREATED)
    )

    def create(self, validated_data):
        task_list = validated_data['tasks_ids']

        # Update the tasks here
        update_task_list(task_list)

请记住,这task_list不是查询集(是Task对象列表),不可能调用类似task_list.update(). 必须为每个对象执行更新操作


推荐阅读