打开Django REST framework官网: https://www.django-rest-framework.org/
使用它的好处:
您可能要使用REST框架的一些原因:
检查环境这些包是否都安装了,缺什么我们就按上谁
安装:
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 里实例化一个。

今天就到这里,脑壳都看疼了。
登陆后方可评论