Skip to content

why a nested Serializer run repeatly 4 times #8788

@flyly0755

Description

@flyly0755

Checklist

  • Raised initially as discussion #...
  • This cannot be dealt with as a third party library. (We prefer new functionality to be in the form of third party libraries where possible.)
  • I have reduced the issue to the simplest possible case.
models.py
class Hanzi(AbstractBaseModel):
    zi = models.CharField('汉字', max_length=1, unique=True, null=False, blank=False)
    nandu = models.SmallIntegerField("难度", choices=Constant.HANZI_NANDU, null=True, blank=True)
    zhuyin = models.CharField('主音', max_length=10, null=True, blank=True)
    duoyininfo = JSONField('多音字', null=True, blank=True)
    created_at = models.DateTimeField(verbose_name='Created at', auto_now_add=True, null=True)
    modified_at = models.DateTimeField(verbose_name='Modified at', auto_now=True, null=True)
serializers.py
class HanziListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hanzi
        fields = ['id', 'zi', 'zhuyin', 'zhuyindiao', 'nandu']


class JSONSerializerField(serializers.Field):
    """ Serializer for JSONField -- required to make field writable"""
    def to_representation(self, data):
        print(17, data, type(data))
        json_data = {}
        try:
            json_data = json.loads(data)
        except ValueError as e:
            pass
        finally:
            print(24, json_data, type(json_data))
            return json_data
            # return {'zhe': '朝~', 'zhuó': '穿~'}

    def to_internal_value(self, value):
        # print(29, value, type(value))
        tmpvalue = json.loads(value)
        # print(31, tmpvalue, type(tmpvalue))
        # print(30, json.dumps(value, ensure_ascii=False), type(json.dumps(value, ensure_ascii=False)))
        return json.dumps(tmpvalue)


class HanziSerializer(serializers.ModelSerializer):
    duoyininfo = JSONSerializerField()

    class Meta:
        model = Hanzi
        fields = "__all__"

views.py
class HanziViewSet(viewsets.ModelViewSet, BaseViewSetMixin):
    queryset = Hanzi.objects.all()
    serializer_class = HanziSerializer

    filter_backends = [SearchFilter, DjangoFilterBackend]
    # 模糊查询,使用单个查询参数可以对多个字段进行查询
    search_fields = ['zhuyin', 'zhuyin2']
    # 精准查询,一个参数对应一个字段进行过滤查询
    filter_fields = ['zi']

    def get_serializer_class(self):
        if self.action == 'list':
            return HanziListSerializer

        return super(HanziViewSet, self).get_serializer_class()
        # return HanziSerializer

    def perform_update(self, serializer):
        user = self.fill_user(serializer, 'update')
        return serializer.save(**user)

    def perform_create(self, serializer):
        user = self.fill_user(serializer, 'create')
        return serializer.save(**user)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions