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:

方式2:

只做数据序列化,数据校验时不做任何操作
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

浙公网安备 33010602011771号