首页 > 解决方案 > DRF SerializerMethodField 没有被调用

问题描述

这是我的序列化器:

class MetaDataSerializer(serializers.Serializer):
    bg_colors = ColorSerializer(Color.objects.all(), many=True)
    button_choices = serializers.SerializerMethodField()

    class Meta:
        fields = ('bg_colors', 'button_choices')

    def get_button_choices(self, obj):
        return {
            'save': 1, 'continue': 2, 'cancel': 3, 'back': 4
        }

我从我的视图中调用这个序列化程序,如下所示:

class MetaDataView(RetrieveAPIView):
    serializer_class = MetaDataSerializer

    def get(self, request, *args, **kwargs):
        return Response(self.get_serializer().data)

在回复中,我只得到了bg_colors字段。响应中没有另一个字段,并且它的 get_field 方法也没有被调用。

我在这里做错了什么?

标签: djangodjango-rest-framework

解决方案


不要Colors在序列化程序定义中传递查询集,而是从您的视图集中传递它。

进行以下更改:

  • 在序列化程序中:-
class MetaDataSerializer(serializers.Serializer):
    bg_colors = ColorSerializer(many=True)
    button_choices = serializers.SerializerMethodField()

    class Meta:
        fields = ('bg_colors', 'button_choices')

    def get_button_choices(self, obj):
        return {
            'save': 1, 'continue': 2, 'cancel': 3, 'back': 4
        }
  • 鉴于:-
class MetaDataView(RetrieveAPIView):
    serializer_class = MetaDataSerializer

    def get(self, request, *args, **kwargs):
        final_data = {"bg_colors": Colors.objects.all()}
        return Response(self.get_serializer(final_data).data)

推荐阅读