DRF SerializerMethodField方法仅在调试器中打开序列化程序变量时运行

时间:2019-12-20 00:03:07

标签: django django-rest-framework

当我在SerializerMethodField方法中的HERE处有断点时,我的return方法仅打印get,然后在其后打开serializer变量已在调用serializer.data时触发OR(在这种情况下,它将打印预期的数据,但validated_data仍然为空)。

查看:

class EventAddPeople(generics.GenericAPIView):

    serializer_class = EventAddPeopleSerializer_Read

    def get(self, request, *args, **kwargs):
        serializer = EventAddPeopleSerializer_Read(data=request.GET)
        serializer.is_valid(raise_exception=True)
        print(serializer.validated_data)
        return HttpResponse(serializer.validated_data)

序列化器:

class EventAddPeopleSerializer_Read(serializers.Serializer):
    event_id = serializers.SerializerMethodField(method_name='get_event_id')
    person_ids = serializers.SerializerMethodField()

    def get_event_id(self, obj):
        print("HERE")
        return "TEST00"

    def get_person_ids(self, obj):
        print("HERE")
        return "TEST00"

    class Meta:
        fields = ('event_id', 'person_ids')

HTTP Request

2 个答案:

答案 0 :(得分:0)

您的get方法未调用(可能是)。

只需在get方法中打印(“任何内容”)即可进行检查

检查Methos中的genericApiViews

谢谢

答案 1 :(得分:0)

第一件事, V1 V2 V3 V4 V5 1 c0 1 1 1 1 2 c1 1 1 1 NA 3 c2 1 1 NA NA 4 c3 8 8 8 8 5 c4 1 1 1 10 适用于 非GET请求 。您不应使用HTTP GET在有效负载部分中发送数据。如果要使用GET方法发送数据,请通过 URL查询参数
传递数据 因此,该网址将变为request.data

并且您需要将此查询参数作为

传递给序列化程序
/api/my/end-point/?event_id=1&person_ids=3

第二件事,您错过了在序列化器中添加 serializer = EventAddPeopleSerializer_Read(data=request.GET)

Meta class