zoukankan      html  css  js  c++  java
  • Django REST Framework

    1,使用Django的视图序列化:

        1,HttpResponse

        2,JsonResponse

    2,使用Django REST Framework 框架的序列化工具类。

        1,安装:pip install djangorestframework

        2,导入:from rest_framework import serializers

        3,使用:class ArticleSerializer(serializers.Serializer):

              ...

    起初我们只能使用json序列化传数据:

      url:

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^article_list/', views.article_list),
    ]

      第一版views:

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    from app01.models import Article
    
    # 第一版
    import datetime
    def article_list(request):
        # 去数据库查询所有的文章数据
        query_set = Article.objects.all().values("id","title","create_time","type", "school__name")
        print(query_set)
        # 序列化成json格式
        # 1,先把时间对象转换成字符串格式
        for i in query_set:
            print(i["create_time"])
            i["create_time"] = i["create_time"].strftime("%Y-%m-%d")
            print(i["create_time"])
        import json
        data = json.dumps(list(query_set),ensure_ascii=False)  # dumps无法直接传入query_set这种格式,所以先转成list,
        # ensure_ascii = False 显示中文,
        return HttpResponse(data)

    models:

    from django.db import models
    
    # Create your models here.
    
    class Article(models.Model):
        title = models.CharField(max_length=32)
        create_time = models.DateTimeField()
        type = models.SmallIntegerField(
            choices=((1,"原创"),(2,"转载")),
            default=1
        )
    
        school = models.ForeignKey(to="School",on_delete=models.CASCADE)
    
        # 标签
        tag = models.ManyToManyField(to="Tag")
    
    class School(models.Model):
        name = models.CharField(max_length=32)
    
    
    class Tag(models.Model):
        name = models.CharField(max_length=32)

    由于sqlite中,直接在数据库中增加的datetime时间类型无法取出数据值,所以需要新建一个独立的insert_time文件进行时间格式转化。

    insert_time.py:

    import os
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE","restfreeme.settings")
        import django
        django.setup()
    
        # 单独的py文件去导入数据,上面是必不可少的步骤,后面一个参数"restfreeme.settings" 是当前项目名称.settings
    
    
        from app01.models import Article
        import datetime
    
        article_list = Article.objects.all()
        for i in article_list:
            i.create_time = datetime.datetime.now()
            i.save()
        query_set = Article.objects.all().values("id", "title", "create_time", "type", "school__name")
        obj = Article.objects.first()
        ret = obj.type
        ret = obj.get_type_display()
        # 默认用法 get_type_display()可以获取当前choice的,第二个元素。

    第二版:views:

    # 第二版
    def article_list(request):
        # 去数据库查询所有的文章数据
        query_set = Article.objects.all().values("id","title","create_time","type","school")
        for i in query_set:
            school_obj = School.objects.filter(id=i["school"]).first()
            id = school_obj.id
            name = school_obj.name
            i["school"] = {"id":id,"name":name}
            # 将query_set中的school赋值为{"id":id,"name":name} 这种格式
    
        # 返回
        # print(query_set)
        return JsonResponse(list(query_set),safe=False)
        # JsonResponse默认传的参数是一个字典类型的数据,若是传其他数据类型,则需要加上safe = False

      第三版views:

    # 第三版 rest framework版
    from rest_framework import serializers
    
    # class Frame(serializers.Serializer):
    #     id = serializers.IntegerField()
    #     title = serializers.CharField()
    #     create_time = serializers.DateField()
    #     type = serializers.IntegerField()
    #     school = serializers.CharField(source="school.name")
        # source 如果是属性就直接返回,如果是方法则执行方法。
    
    class Frame(serializers.ModelSerializer):
        type = serializers.CharField(source="get_type_display")
    
        class Meta:
            model = Article
            fields = "__all__"
            depth = 1   # 把关联的字段的表的所有字段逐层递归
                        # 官方不推荐超过10层  通俗的来说就是数据层数例如:[1,2,[4,]]这样就是有两层,
                        # 所以如果想查到内层的列表就可以写 depth = 1 ,依次类推。
    
    def article_list(request):
        # 去数据库中查询所有文章数据
        query_set = Article.objects.all()
        # print(query_set)
        change_data = Frame(query_set,many=True)
        print(change_data)
        # Frame(<QuerySet [<Article: Article object>, <Article: Article object>]>, many=True):
        # id = IntegerField(label='ID', read_only=True)
        # type = CharField(source='get_type_display')
        # title = CharField(max_length=32)
        # create_time = DateTimeField(read_only=True)
        # school = NestedSerializer(read_only=True):
        #     id = IntegerField(label='ID', read_only=True)
        #     name = CharField(max_length=32)
        # tag = NestedSerializer(many=True, read_only=True):
        #     id = IntegerField(label='ID', read_only=True)
        #     name = CharField(max_length=32)
        
        # 传入query_set类型,后面many=True意思是具有多个对象时,可加上,若是单个对象则不需要。
        print(change_data.data)
        #  返回的是一个有序字典:
        # [OrderedDict([('id', 1), ('type', '原创'), ('title', '三国演义'), ('create_time', '2018-07-31T19:51:53.460497Z'),
        #               ('school', OrderedDict([('id', 1), ('name', '北京')])),
        #               ('tag', [OrderedDict([('id', 1), ('name', '历史')])])]), OrderedDict(
        #     [('id', 2), ('type', '转载'), ('title', '西游记'), ('create_time', '2018-07-31T19:51:53.475487Z'),
        #      ('school', OrderedDict([('id', 2), ('name', '上海')])), ('tag', [OrderedDict([('id', 2), ('name', '神话')])])])]
    
        # 返回
        return JsonResponse(change_data.data,safe=False)
    
    
    def article_detail(request,id):
        article_obj = Article.objects.filter(id=id).first()  # 筛选出一个文章对象。
        json_detail = Frame(article_obj)
        return JsonResponse(json_detail.data)
  • 相关阅读:
    css 解决fixed 布局下不能滚动的问题
    js 正则常用函数 会正则得永生
    巧用call,appl有 根据对象某一属性求最大值
    锚点 , angular 锚点 vue锚点
    css 改变浏览器滚动条的样式
    angular 常用插件集合
    angular4,angular6 父组件异步获取数据传值子组件 undefined 问题
    angular组件之间的通讯
    tomcat的配置详解:[1]tomcat绑定域名
    click 绑定(三)防止事件冒泡
  • 原文地址:https://www.cnblogs.com/stfei/p/9398420.html
Copyright © 2011-2022 走看看