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来访问接口
但是这样数据结构不够清晰,且有重复的数据,所以接下来可以根据需要对数据进行整理。
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)
最后的效果,所有的数据都在一个树形结构里