Django REST framework的基本使用

安装:

pip install djangorestframework

settings.py中进行配置

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'blog',
]

编写api.py

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import serializers
from blog.models import SiteInfo,Classes,UserInfo

class Classes_data(serializers.ModelSerializer):
    class Meta:
        depth = 1
        model = Classes
        fields = '__all__'
  
class UserInfo_data(serializers.ModelSerializer):
    class Meta:
        depth = 1
        model = UserInfo
        fields = '__all__'
  
@api_view(['GET','POST'])
def apiTest(request):
    classes = Classes.objects.all()
    userinfo = UserInfo.objects.all()
    classes_data = Classes_data(classes,many=True)
    userlist_data = UserInfo_data(userinfo,many=True)
    data = {
        'classes':classes_data.data,
        'userlist':userlist_data.data
    }
    if request.method == 'POST':
        return Response('POST OK')
    return Response({'data':data})

urls.py

from blog import views,api

urlpatterns = [
    path('',views.index),
    path('classes/',views.classes),
    path('admin/', admin.site.urls),
    #api接口
    path('api/',api.apiTest),   

完成基本配置后,就可以通过/api来访问接口

image.png

但是这样数据结构不够清晰,且有重复的数据,所以接下来可以根据需要对数据进行整理。

Python字典的数据整理

重新修改后的api.py,通过for循环手工提取数据存入字典

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import serializers
from blog.models import SiteInfo,Classes,UserInfo

class Classes_data(serializers.ModelSerializer):
    class Meta:
        depth = 1
        model = Classes
        fields = '__all__'
  
# class UserInfo_data(serializers.ModelSerializer):
#     class Meta:
#         depth = 1
#         model = UserInfo
#         fields = '__all__'
  
@api_view(['GET','POST'])
def apiTest(request):
    classes = Classes.objects.all()
    # userinfo = UserInfo.objects.all()
    # classes_data = Classes_data(classes,many=True)
    # userlist_data = UserInfo_data(userinfo,many=True)
    # data = {
    #     'classes':classes_data.data,
    #     'userlist':userlist_data.data
    # }
    data = {
        'classes':[]
    }
    for i in classes:
        class_data = {
            'id':i.id,
            'text':i.text,
            'userlist':[]
        }
        userlist = i.userinfo_classes.all()
        for user in userlist:
            user_data = {
                'id':user.id,
                'nickName':user.nickName,
                'headImg':str(user.headImg)
            }
            class_data['userlist'].append(user_data)
        data['classes'].append(class_data)
  
    if request.method == 'POST':
        return Response('POST OK')
    return Response(data)

其中userinfo_classes是在models.py中定义的related_name,是通过外键关联的父集来查询子集,而user_data中的headImg字段在定义时为图片字段,调用会有问题,实际上保存的是图片的地址,所以将其转化为字符串即可。最后在返回数据的时候直接传入data

class UserInfo(models.Model):
    nickName = models.CharField(max_length=50)
    headImg = models.ImageField(upload_to='userinfo/',null=True,blank=True)
    belong = models.ForeignKey(Classes,on_delete=models.SET_NULL,related_name='userinfo_classes',null=True,blank=True)

最后的效果,所有的数据都在一个树形结构里

image.png

最后修改:2021 年 04 月 23 日
如果觉得我的文章对你有用,请随意赞赏