一、ModelSerializer和Serializer的区别

  • Serializer:
    • 创建序列化器时必须把需要的字段全部写出来,并且序列化器中的每一个字段都要和模型类中的对应字段一样的设置
    • 需要重写create()方法
    • 适合字段少的数据表,字段多的数据表或者项目较大时开发会很繁琐
  • ModelSerializer:
    • 不需要写每一个字段,直接在class Meta中定义model和fields即可,序列化器会根据模型类来自动生成所有指定的字段
      • 如果只序列化部分字段,fields必须是元组/列表格式
      • 如果是全部的字段信息,则直接写”all“即可
    • 开发效率更高,代码量大大减少
    • 如果需要对某一个字段做特别的处理,可以在序列化器中单独写出该字段(自定义字段)
    • 不需要重写create()方法,框架自动调用父类中的该方法 ```python from rest_framework import serializers from .models import UserProfile

class UserProfileSerializers(serializers.ModelSerializer): ‘’’ 用户序列化器 ‘’’ password = serializers.CharField(max_length=20)

  1. class Meta:
  2. model = UserProfile
  3. fields = ('username', 'password', 'open_id', 'code')
  1. <a name="KMtXO"></a>
  2. ### 二、通过序列化器查询数据
  3. > 在python3 shell中测试,进入shell的命令:python3 manage.py shell,注意:在shell中导入的app中的模块时必须使用app名.文件名的方式来导入
  4. - 查询数据列表:
  5. ```python
  6. # python shell
  7. from users.serialziers import UserProfileSerializers
  8. from users.models import UserProfile
  9. users = UserProfile.objects.all()
  10. serializer = UserProfileSerializers(instance=users, many=True) # 在查询或者更新数据时必须加上instance,当多条数据时必须使用many=True
  11. print(serializer.data)
  12. """
  13. 结果:查询的结果是由字典组成的有序列表 OrderedDict
  14. """
  • 查询单条数据 ```python

    python shell

    from users.serialziers import UserProfileSerializers from users.models import UserProfile

user = UserProfile.objects.get(id=14) serializer = UserProfileSerializers(instance=user) # 在查询或者更新数据时必须加上instance print(serializer.data)

“”” 结果:查询的结果是字典 “””

  1. <a name="TRZDw"></a>
  2. ### 三、更新某一条数据
  3. - 更新数据需要先根据id来获取数据对象
  4. - 在序列化器对象中添加instance属性
  5. - 更新不需要重写update()方法
  6. ```python
  7. from users.serializers import UserProfileSerializers
  8. from users.moddels import UserProfile
  9. user_dict = {
  10. 'username': 'liming',
  11. 'mobile': '1278932408'
  12. }
  13. user = UserProfile.objects.get(id=29)
  14. serializer = UserProfileSerializers(instance=user, data=user_dict) # 更新必须指定对哪一个数据对象做更新操作
  15. serializer.is_valid(raise_exception=True)
  16. serializer.save()

四、创建一条数据

  • 创建数据不需要使用instance属性
  • 创建不需要重写create()方法 ```python from users.serializers import UserProfileSerializers from users.moddels import UserProfile

user_dict = { ‘username’: ‘liming’, ‘code’: ‘dsjhfwofbwdkjfbwof’, ‘open_id’: ‘dsflwnwiowhfndli214nkfl2irnf’ ‘mobile’: ‘1278932408’ }

serializer = UserProfileSerializers(data=user_dict) serializer.is_valid(raise_exception=True) serializer.save()

  1. <a name="9oZOw"></a>
  2. ### 五、class Meta设置
  3. - model:对应的模型类
  4. - fields: 生成的字段
  5. - read_only_fields:批量设置字段为只读属性,如果只是设置单个字段,可以在字段内添加read_only=True
  6. - extra_kwargs:批量给已经生成的字段添加额外的字段约束,格式的字典,字典内key是字段名,value是字典,value内是具体的设置。
  7. ```python
  8. extra_kwargs = {
  9. 'password': {
  10. "required": False,
  11. "default": ""
  12. }
  13. }
  14. # 可以写多个字段