zoukankan      html  css  js  c++  java
  • Django REST framework 序列化

    表结构

    class Article(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=64)
        create_time = models.DateField(auto_now=True)
        type = models.SmallIntegerField(
            choices=((1, '原创'), (2, '转载')),
            default=1
        )
        source = models.ForeignKey(to='Source', on_delete=models.CASCADE)
        tag = models.ManyToManyField(to='Tag')
    
    
    class Source(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32, unique=True, error_messages={"unique": '校区名称不能重复'})
    
    
    class Tag(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
    
    
    class Comment(models.Model):
        content = models.CharField(max_length=255)
        article = models.ForeignKey(to='Article', on_delete=models.CASCADE)

    单表的GET和POST:

    路由:

    url(r'source/', views.SourceView.as_view()),

    序列化类:

    from rest_framework import serializers # 导入内置的序列化方法
    class SourceSerializer(serializers.ModelSerializer): def validate_name(self, value): if '' in value: raise ValidationError('不符合社会主义核心价值观') return value class Meta: # 取出当前对象的所有数据 model = models.Source # 查询的表 fields = "__all__"

    视图:

    from  rest_framework.views import APIView
    class SourceView(APIView):
    
        def get(self, request, *args, **kwargs):
            res = {"code": 0} # 0 为正常访问 , 1 为访问错误
            all_source = models.Source.objects.all()
            ser_obj = SourceSerializer(all_source, many=True) # 序列化查出来的所有对象
            res["data"] = ser_obj.data
            return Response(res)
    
        def post(self, request, *args, **kwargs):
            res = {"code": 0}
            ser_obj = SourceSerializer(data=request.data)
            if ser_obj.is_valid():
                # 数据没问题
                ser_obj.save()
                return Response(res)
            else:
                res["code"] = 1
                res["error"] = ser_obj.errors
                return Response(res)

    外键的GET和POST:

    路由:

    url(r'comment/', views.Comment.as_view())

    序列化:

    from rest_framework import serializers  
    class CommentSerializer(serializers.ModelSerializer): class Meta: model = models.Comment fields = "__all__" extra_kwargs = { # 报错信息 "content": {"error_messages": {"required": "评论内容不能为空"}}, "article": {"error_messages": {"required": "文章不能为空"}} }

    视图:

    class Comment(APIView):
        def get(self, request, *args, **kwargs):
            res = {"code": 0}
            all_data = models.Comment.objects.all()
            ser_obj = CommentSerializer(all_data, many=True)
            res["data"] = ser_obj.data
            return Response(res)
    
        def post(self, request, *args, **kwargs):
            res = {"code": 0}
            ser_obj = CommentSerializer(data=request.data)
            if ser_obj.is_valid():
                ser_obj.save()
            else:
                res["code"] = 1
                res["error"] = ser_obj.errors
            return Response(res)

     

    多对多的GET和POST:

    路由:

    url(r'article/', views.ArticleList.as_view()),

    序列化:

    class TagSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = models.Tag
            fields = "__all__"
    
    
    class ArticleSerializer(serializers.ModelSerializer):
        type = serializers.CharField(source="get_type_display")
        tag = TagSerializer(many=True)
    
        class Meta:
            model = models.Article
            fields = ["id", "title", "type", "source", "tag"]  # 取出表的单个值
    
    
    class ArticleWriteSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = models.Article
            fields = "__all__"
            extra_kwargs = {
                "tag": {
                    "error_messages": {
                        "does_not_exist": '"{pk_value}"对应的tag对象不存在。'
                    }
                }
            }

    视图:

    class ArticleList(APIView):
        def get(self, request, *args, **kwargs):
            res = {"code": 0}
            article_list = models.Article.objects.all()
            ser_obj = ArticleSerializer(article_list, many=True)
            res["data"] = ser_obj.data
            return Response(res)
    
        def post(self, request, *args, **kwargs):
            res = {"code": 0}
            ser_obj = ArticleWriteSerializer(data=request.data)
            if ser_obj.is_valid():
                ser_obj.save()
            else:
                res["code"] = 1
                res["error"] = ser_obj.errors
            return Response(res)

    超链接的序列化:

    路由:

    urlpatterns = [
        url(r'articlelinked/', views.ArticleLinked.as_view()),,
        url(r'source/(?P<pk>d+)', views.SourceDetailView.as_view(), name='source-detail'),
    ]

    序列化:

    class ArticleHyperlinkedSerializer(serializers.HyperlinkedModelSerializer):
        source = serializers.HyperlinkedIdentityField(view_name='source-detail', lookup_field='source_id', lookup_url_kwarg='pk')
    
        class Meta:
            model = models.Article
            fields = ["id", "type", "title", "source"]
            depth = 1

    视图:

    class ArticleLinked(APIView):
        def get(self, request, *args, **kwargs):
            res = {"code": 0}
            article_list = models.Article.objects.all()
            ser_obj = ArticleHyperlinkedSerializer(article_list, many=True, context={'request': request})
            res["data"] = ser_obj.data
            return Response(res)
  • 相关阅读:
    如何自建appender扩展Log4j框架
    在O(1)时间删除链表结点
    My First GitHub
    JAVA序列化和反序列化
    [转]Vim 复制粘帖格式错乱问题的解决办法
    Centos清理内存 内存回收释放及内存使用查看的相关命令
    Spark HA 的搭建
    Ambari安装
    Hadoop HA的搭建
    Hadoop32位和64位的查询
  • 原文地址:https://www.cnblogs.com/zpf666/p/10279076.html
Copyright © 2011-2022 走看看