【Django REST framework】通过APIview实现序列化(3)


发布时间:2020-02-16 21:07    作者: 晖哥哥   已过去:1 年,8 月   阅读总量:1136 已被赞:0


打开Django REST framework官网: https://www.django-rest-framework.org/

使用它的好处:

您可能要使用REST框架的一些原因:

检查环境这些包是否都安装了,缺什么我们就按上谁

  • coreapi(1.32.0+)-模式生成支持。
  • Markdown(3.0.0+)-对可浏览API的Markdown支持。
  • Pygments(2.4.0+)-在Markdown处理中添加语法突出显示。
  • django-filter(1.0.1+)-过滤支持。
  • django-guardian(1.1.1+)-对象级别权限支持。

 安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple coreapi
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  Pygments
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-guardian
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  django-crispy-forms

这里有个问题:安装 django-guardian的时候,该插件直接把我的django升级到3.0了 算了先用用看,不顺手再想办法解决吧。

来到主url.py里,配置文档路径

from django.contrib import admin
from django.urls import path,re_path,include
#引入文档
from rest_framework.documentation import include_docs_urls
urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
    re_path(r'^api-auth/', include('rest_framework.urls')),
    re_path(r'^docs/', include_docs_urls(title='博客文档'))
]

浏览器输入:

http://127.0.0.1:8000/docs/

效果:

 

settings.py 配置:

INSTALLED_APPS = [
    ...
    'blog',
    'crispy_forms',
    'rest_framework',
]

 

主url.py里配置登录文档的路径:

from django.contrib import admin
from django.urls import path,re_path,include
#引入文档
from rest_framework.documentation import include_docs_urls
urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
    #re_path(r'^api-auth/', include('rest_framework.urls')),  删除这个重复了
    re_path(r'^docs/', include_docs_urls(title='博客文档')),
   re_path(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

在blog/下新建serializer.py 这就相当于django的表单一样,起到验证作用。

serializer.py

from rest_framework import serializers
from .models import Blog_Posts
class Blog_PostsSerializer(serializers.ModelSerializer):
    '''
    可以一个一个写字段,如果是全部字段都要序列化,
    例如:
    class Blog_PostsSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(required=False, allow_blank=True, max_length=100)
    code = serializers.CharField(style={'base_template': 'textarea.html'})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')

    我们不用这个,因为我们要全部字段,就这样做
    '''
    class Meta:
        model = Blog_Posts
        fields "__all__"

blog/view.py:用apiview来序列化:

from rest_framework.views import APIView
from rest_framework.response import Response
from .serializer import Blog_PostsSerializer
from .models import Blog_Posts
class Blog_PostslistView(APIView):
    '''
    APIView 实现序列化
    '''
    def get(self,request,format=None):
        posts = Blog_Posts.objects.all() #获取数据
        #丢进去序列化
        posts_Serializer = Blog_PostsSerializer(posts,many=True) #序列化单个对象去掉many=True
        #所有内容都是通过data 拿或返回
        return Response(posts_Serializer.data)

打开:http://127.0.0.1:8000/blog/

效果:

发现序列化后,外键都是ID,不是直接显示我们的字段名字,我们怎么做呢?很简单,我们直接在serializer.py

里嵌套serializer类

serializer.py:

from rest_framework import serializers
from .models import Blog_Posts,Tag
from django.contrib.auth.models import User

 

class User_Serializer(serializers.ModelSerializer):
    '''
    定义好后,去用于需要显示外键的Serializer,用models里定义的外键实例化本类
    '''
    class Meta:
        model = User
        fields "__all__"

 

class Tag_Serializer(serializers.ModelSerializer):
    '''
    定义好后,去用于需要显示外键的Serializer,用models里定义的外键实例化本类
    '''
    class Meta:
        model = Tag
        fields "__all__"

 

class Blog_PostsSerializer(serializers.ModelSerializer):
    '''
    我们不用这个,因为我们要全部字段,就这样做
    '''
    tag = Tag_Serializer() #models里定义的外键实例化,就不会显示PK
    author = User_Serializer()
    class Meta:
        model = Blog_Posts
        fields "__all__"

 有多少外键,就做多少个嵌套,如果是多级外键,就做成多级嵌套,比如tag里还要外键,

我们就去 Tag_Serializer 里实例化一个。

  今天就到这里,脑壳都看疼了。

点赞

0




登陆后方可评论