Djano之写api使用django_rest_framework【海瑞博客】
2024-09-08 14:12:38
使用django rest framework 可以更快速和友好的编写api,当然网上有很多教程,对于高手来说相对很简单,对于新手来说,根本搞不明白。那是你没有搞明白你自己的职责,做为后端,我们只要提供接口即可,根据提供的参数,对于返回数据。所以,我们需要友好的返回数据并有说明。
官方网站:
http://www.django-rest-framework.org/
中文教程:
Django-REST-framework教程中文版.pdf
OK 开始学习吧!
首先Model
class Disk(models.Model):
"""
"""
identify = models.CharField(max_length=64)
description = models.CharField(max_length=64, default=u'500G*2')
orgid = models.CharField(max_length=24) def __unicode__(self):
return "%s" % self.description class Meta:
unique_together = ('identify', 'orgid')
urls写法
from rest_framework import routers
from django.conf.urls import url, include # 创建路由对象
router = routers.DefaultRouter()
# 将url 注册到路由对象中
router.register(r'assets/(?P<orgid>\d+)', views.AssetViewSet) # 第一个url 就是我们正常的就可以了,后面2个必须是这种写法,一个字都不能错的
urlpatterns = [
url(r'^assets/(?P<orgid>\d+)/upload$', fileviews.AssetUploadViewSet.as_view()),
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
创建一个serializers.py
from rest_framework import serializers
from models import Disk class DiskSerializer(serializers.ModelSerializer):
def validate(self, data):
"""
数据验证并保证数据的一致性
"""
if not data['identify'] or not data['orgid']:
raise serializers.ValidationError("Must have fields: identify, orgid") if data['identify']:
if Disk.objects.filter(identify=data['identify'], orgid=data['orgid']):
raise serializers.ValidationError("Data is duplicated")
return data def create(self, validated_data):
‘’‘新建’‘’
disk_obj = Disk.objects.create(**validated_data)
return disk_obj def update(self, instance, validated_data):
'''更新'''
instance.identify = validated_data.get('identify', instance.identify)
instance.description = validated_data.get('description', instance.description)
instance.orgid = validated_data.get('orgid', instance.orgid)
instance.save() return instance class Meta:
model = Disk
fields = "__all__"
views写法
from django.shortcuts import render, get_object_or_404, get_list_or_404
from rest_framework import generics, viewsets
from rest_framework.response import Response
from rest_framework import permissions
from models import Disk
from serializers import DiskSerializer class DiskViewSet(viewsets.ModelViewSet):
"""
硬盘的views
"""
queryset = Disk.objects.all()
serializer_class = DiskSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,) def list(self, request, *args, **kwargs):
'''
返回所有数据列表,get
'''
orgid = self.kwargs['orgid']
self.queryset = Disk.objects.filter(orgid=orgid)
serializer = DiskSerializer(self.queryset, many=True)
return Response({
"status": 0,
"data": serializer.data,
"msg": ""
}) def retrieve(self, request, *args, **kwargs):
'''条件查询'''
orgid = self.kwargs['orgid']
pk = self.kwargs['pk']
liaison = get_object_or_404(self.queryset, identify=pk, orgid=orgid)
serializer = DiskSerializer(liaison) return Response({
"status": 0,
"data": serializer.data,
"msg": ""
}) def create(self, request, *args, **kwargs):
'''创建数据列表 post的时候走此方法'''
orgid = self.kwargs['orgid']
request.data.update({'orgid': orgid})
if Disk.objects.filter(identify=request.data['identify'], orgid=orgid).count() == 0:
serializer = DiskSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response({
"status": 0,
"data": "",
"msg": "create Disk liaison success"
})
return Response({
"status": 1,
"data": "",
"msg": " Disk liaison existed"
}) def update(self, request, *args, **kwargs):
'''更新数据,put'''
partial = kwargs.pop('partial', False)
orgid = self.kwargs['orgid']
pk = self.kwargs['pk']
instance = get_object_or_404(self.queryset, identify=pk, orgid=orgid)
serializer = self.get_serializer(instance, request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response({
"status": 0,
"data": serializer.data,
"msg": ""
}) def destroy(self, request, *args, **kwargs):
'''数据'''
partial = kwargs.pop('partial', False)
orgid = self.kwargs['orgid']
pk = self.kwargs['pk']
instance = get_object_or_404(self.queryset, identify=pk, orgid=orgid)
self.perform_destroy(instance) return Response({
"status": 0,
"data": "",
"msg": "delete Memory liaison success"
})
我们来说说我们关心的问题
第一:我们get带的参数去哪去取?
在get请求都是获取数据,那我们传的数据都在request对象中,request与Django自己的不一样,rest的request将数据封装到了 request.query_params,属性中,可以使用get获取。
第二:url的参数动态值怎么取?
在请求中,我们传的值都在**kwargs里,直接获取即可,记得用get。
想查看更多内容,请访问 http://www.hairuinet.com
最新文章
- UDT中epoll对CLOSE状态的处理
- 配置Openfire的eclipse项目
- Oracle10G无图形安装及升级
- 16.iOS APP图标和启动画面尺寸
- plsql导入excel时报错:ORA-01036: 非法变量名/编号
- Dubbo系列(3)_官方Demo说明
- 套接字I/O模型-完成端口IOCP
- Linux删除文件夹命令
- 关于Qt5 UI设计的一些小知识
- USB匹配电阻
- 关于python命令在editor里编写与在interpreter里的编写的不同之处
- Visual Studio 2012中使用Zen Coding,写html的神器!
- Inno Setup入门(十九)&mdash;&mdash;Inno Setup类参考(5)
- vue传参
- window下安装PIL
- 接口自动化python
- 加号变空格问题 url参数 post get 请求发送
- Mybatis 系列1-环境搭建
- 【百度】大型网站的HTTPS实践(二)——HTTPS加密算法介绍
- 测试用例文件的存放和创建,对page objeck的理解