13 DRF-自定义钩子

需求:

编写一个序列化类,实现创建用户
    提供:{"name":"x1", "age":11, "gender":1}
    返回:{"id":1, "name":"x1","age":11,"gender":"男"}


class NbUserInfo(models.Model):
    name = models.CharField(verbose_name='姓名', max_length=32)
    age = models.IntegerField(verbose_name='年龄')
    gender = models.SmallIntegerField(verbose_name='性别', choices=((1, '男'), (2, '女')))

方式1:

image


方式2:

image


只做数据序列化,数据校验时不做任何操作

NbHook
from collections import OrderedDict
from rest_framework.fields import SkipField
from rest_framework.relations import PKOnlyObject


class NbHookSerializer(object):
    def to_representation(self, instance):
        ret = OrderedDict()
        fields = self._readable_fields

        for field in fields:
            if hasattr(self, 'nb_%s' % field.field_name):
                value = getattr(self, 'nb_%s' % field.field_name)(instance)
                ret[field.field_name] = value
            else:
                try:
                    attribute = field.get_attribute(instance)
                except SkipField:
                    continue

                check_for_none = attribute.pk if isinstance(attribute, PKOnlyObject) else attribute
                if check_for_none is None:
                    ret[field.field_name] = None
                else:
                    ret[field.field_name] = field.to_representation(attribute)

        return ret
posted @ 2022-10-21 17:21  角角边  Views(20)  Comments(0)    收藏  举报