温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用ModelSerializer和Mixin

发布时间:2021-11-30 17:19:52 来源:亿速云 阅读:105 作者:小新 栏目:编程语言

这篇文章主要介绍如何使用ModelSerializer和Mixin,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

使用serializers.ModelSerializer

之前我们学了serializers模块中Serializer类的使用,现在我们来学习一下如何使用Django中的serializers.ModelSerializer类替换之前的serializers.Serializer类
上一章我们是在Schools APP中的serializer.py中编写的代码吧,我们先看一下之前的代码

from rest_framework import serializers
from .models import School
class SchoolSerializer(serializers.Serializer):
    name = serializers.CharField()
    desc = serializers.CharField()
    location = serializers.CharField()
    create_time = serializers.DateTimeField(default=datetime.now,)
    course_numbers = serializers.IntegerField()
    def create(self, validated_data):
        """
        Create and return a new `Snippet` instance, given the validated data.
        """
        return School.objects.create(**validated_data)

我们定义了一个SchoolSerializer类,继承了serializers.Serializer类,然后在其中定义了5个字段对吧,那我们来看一下如何把serializers.Serializer类替换成serializers.ModelSerializer类吧

class SchoolSerializer(serializers.ModelSerializer):
    class Meta:
        # 指定需要序列化的Model
        model = School    
        # 指定需要序列化的Model中的字段
        fields = ('name', 'desc')
        # 序列化所有的字段
        fields = '__all__'
    def create(self, validated_data):
        """
        Create and return a new `Snippet` instance, given the validated data.
        """
        return School.objects.create(**validated_data)

看上面代码可以看出,可以使用fields指定需要序列化的Model中的字段,可以指定一个、两个..或者所有字段,如果我们要指定序列化所有字段我们可以使用fields = '__all__'
我们先来看一下如果序列化两个字段是什么样子fields = ('name', 'desc')

如何使用ModelSerializer和Mixin

再来试一下序列化所有字段是什么样子:fields = '__all__'

如何使用ModelSerializer和Mixin

通过代码我们可以得出结论,也就是使用serializers.ModelSerializer类代替serializers.Serializer类,也就是让schools app中SchoolSerializer类继承serializers.ModelSerializer类,能够让代码更加简洁,也更加方便;

使用mixins.ListModelMixin

mixins可以实现类功能或者函数功能增强,能够动态的增加函数的一些属性和方法,DRF库中有很多功能增强的mixin,

  • ListModelMixin:列表视图扩展类,提供list(request, args, *kwargs)方法快速实现列表视图,返回200状态码,该Mixin的list方法会对数据进行过滤和分页;

  • GenericAPIView:继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法,queryset为列表视图的查询集,serializer_class为视图使用的序列化器;
    那现在我们编辑APP中的views.py文件, 重写AllSchoolsView类

class AllSchoolsView(mixins.ListModelMixin,generics.GenericAPIView ):
    """
    这是AllSchoolsView的返回结果
    """
    # queryset、serializer_class是固定的
    queryset = School.objects.all()
    serializer_class = SchoolSerializer
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

访问接口的效果和之前是一眼的,但是代码却比未修改之前要少,我们来看一下

如何使用ModelSerializer和Mixin

使用generics.ListAPIView简化AllSchoolsView

我们通过查看ListAPIView的继承关系能够看到ListAPIView继承mixins.ListModelMixin和GenericAPIView:

class ListAPIView(mixins.ListModelMixin, GenericAPIView):

修改一下AllSchoolsView的继承关系,我们发现如果让AllSchoolsView继承generics.ListAPIView,访问接口的效果和之前也是一样的,甚至可以省略get方法,
因为ListAPIView类自带一个get方法,如此可以更加的简洁代码了。就不放效果图了,和上面的图一样;

class AllSchoolsView(generics.ListAPIView):
    """
    这是AllSchoolsView的返回结果
    """
    # queryset、serializer_class是固定的
    queryset = School.objects.all()
    serializer_class = SchoolSerializer
    # def get(self, request, *args, **kwargs):
        # return self.list(request, *args, **kwargs)

在rest_framework库下的generics.py中有很多封装好的View

如何使用ModelSerializer和Mixin

这里的规律是Create表示添加,Retrieve表示操作一条数据,List表示操作多条数据,Destroy表示删除,Update表示更新。

  • ListCreateAPIView:用于post提交之后添加多条数据

  • RetrieveAPIView:用于返回一条数据

  • ListAPIView:用于返回一个表的数据,或多条数据

  • CreateAPIView:添加一条数据

以上是“如何使用ModelSerializer和Mixin”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI