DRF SerializerMethodField 未被调用

Kes*_*iya 6 django django-rest-framework

这是我的序列化器:

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
        }
Run Code Online (Sandbox Code Playgroud)

我从我的角度调用这个序列化器,如下所示:

class MetaDataView(RetrieveAPIView):
    serializer_class = MetaDataSerializer

    def get(self, request, *args, **kwargs):
        return Response(self.get_serializer().data)
Run Code Online (Sandbox Code Playgroud)

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

我在这里做错了什么?

小智 1

不要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
        }
Run Code Online (Sandbox Code Playgroud)
  • 鉴于:-
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)
Run Code Online (Sandbox Code Playgroud)