当前位置:   article > 正文

drf : source,定制序列化字段以及反序列化新增。局部钩子(validate_字段名),全局钩子(validate)...

序列化drf source

source,SerializerMethodField,局部钩子,全局钩子

serialzer.py : source

用处1对应字段:起别名,

用处2对应方法:在表模型中定义一个方法,source可以与其关联

用处3对应方法:可以当做字段

第三种方法的扩展用法:使用程度高。
model.py
  1. from django.db import models
  2. # Create your models here.
  3. class Books(models.Model):
  4. name = models.CharField(max_length=32)
  5. price = models.IntegerField()
  6. publish = models.ForeignKey(to='Publish',on_delete=models.DO_NOTHING)
  7. # 方法
  8. def publish_detail(self):
  9. """
  10. 从books表查publish表,外键字段在books,正向查询字段名
  11. self为当前books对象
  12. .publish 就是publish对象
  13. :return:
  14. """
  15. return {'name':self.publish.name,'addr':self.publish.addr}
  16. class Publish(models.Model):
  17. name = models.CharField(max_length=32)
  18. addr = models.CharField(max_length=32)

序列化类中写方法

反序列化:数据的验证,字段自己的校验规则,局部钩子,全局钩子。

上面数据的保存updata没有校验数据,现在加上校验。

Serializers.py

  1. # 需要序列化和反序列化Book表
  2. class PublishSerializers(serializers.Serializer):
  3. # 1.写字段(需要序列化,反序列化的字段),字段校验
  4. name = serializers.CharField(max_length=8, min_length=3)
  5. addr = serializers.CharField(max_length=8, min_length=3)
  6. # 2.局部钩子
  7. def validate_name(self, name):
  8. if name.startswith('sb'):
  9. raise ValidationError('不能以sb开头')
  10. else:
  11. return name
  12. # 3.全局钩子
  13. def validate(self, attrs):
  14. name = attrs.get('name')
  15. print(name)
  16. addr = attrs.get('addr')
  17. print(addr)
  18. return attrs
  19. # 新增需要重写create
  20. def create(self, validated_data):
  21. publish = Publish.objects.create(**validated_data)
  22. return publish

抛出错误信息

is_valid()方法还可以在验证失败时抛出异常serializers.ValidationError,可以通过传递raise_exception=True参数开启,REST framework接收到此异常,会向前端返回HTTP 400 Bad Request响应。

from rest_framework.exceptions import ValidationError
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/44694
推荐阅读
相关标签
  

闽ICP备14008679号