Django rest_framework 实用技巧
前言:
最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用法
1 #################################################################### 2 ########安装和简单使用 3 ###### 准备工作 4 pip install rest_framework # 安装 5 6 INSTALLED_APPS = ( 7 ... 8 'rest_framework', # 将其加入app列表内 9 ) 10 11 12 ###### urls.py 13 from django.conf.urls import include, url # 引入include二级路由, url 14 from django.contrib import admin # admin模块 15 from rest_framework import routers # 导入api路由 ! 16 import app1 # 导入app1 17 18 router = routers.DefaultRouter() # 获取api路由对象 19 router.register(r'users', app1.SpecialGiftViewSet)# 注册路由到指定的ViewSet类 20 21 urlpatterns = [ 22 url(r'^admin/', include(admin.site.urls)), 23 url(r'^', include(router.urls)), # 设置api路由转发 24 ] 25 26 27 ###### app1/serializers.py 28 from rest_framework import serializers # api接口用于序列化 model 的类 29 from app1.models import SpecialGift # 自定义的要提供api的model类 30 31 class UserSerializer(serializers.HyperlinkedModelSerializer): # 序列化这个表的类 32 class Meta: 33 model = SpecialGift 34 fields = ('url', 'username', 'email', 'is_staff') # 验证字段可以省略! 35 36 ---------参数扩展----------- 37 # HyperlinkedModelSerializer 是建立超链接关系就是外健使用 "goods": "http://127.0.0.1:8080/goods/1/" 38 # ModelSerializer 建立主健关系在json数据中表现为 'goods': 1 39 # ReadOnlyModelViewSet 未知 40 41 42 ####### app1/views.py 内容 43 from rest_framework import routers, serializers, viewsets # 分别为api的路由, 序列化, viewsets 44 from app1.serializers import SpecialGiftSerializer # 引入处理序列化的类 45 from rest_framework.permissions import AllowAny, IsAuthenticated, IsAdminUser # 用于指定权限, 所有人, 登录用户, 管理员 46 from app01.models import SpecialGift # 引入models类 47 from django.utils import timezone # 按时区的,当前时间 48 # from rest_framework import response 49 50 class SpecialGiftViewSet(viewsets.ReadOnlyModelViewSet): 51 queryset = SpecialGift.objects.all().order_by('-created') # 指定默认查询方式, 按创建时间倒序 52 serializer_class = SpecialGiftSerializer # 指定处理序列化的类 53 permission_classes = [AllowAny] # 指定权限 AllowAny 为所有人 54 55 def get_queryset(self): # 过滤函数 56 return self.queryset.filter(end_time__gt=timezone.now()) # 过滤当前时间以前的记录 57 58 59 60 ###### app1/models.py 中写入模型定义 61 from django.utils.translation import ugettext_lazy as _ # Django国际化翻译 62 63 class SpecialGift(models.Model): 64 title = models.CharField(max_length=64) 65 image = VersatileImageField(_("gift_image"), 66 max_length=255, 67 upload_to=generate_upload_filename, 68 ) 69 min_money = models.DecimalField(_("min_money"), max_digits=7, decimal_places=2, validators=[MinValueValidator(0)]) 70 price = models.DecimalField(_("price"), max_digits=7, decimal_places=2, validators=[MinValueValidator(0)], 71 default=29.9) 72 end_time = models.DateTimeField() 73 74 def __unicode__(self): 75 return self.title 76 77 78 ###### app1/admin.py 中配置管理界面 79 from django.contrib import admin 80 from app1.models import SpecialGift 81 82 admin.site.register(SpecialGift) # 简单注册每行只显示对象名 83 84 # 装饰器注册! 85 @admin.register(SpecialGift) 86 class SpecialGiftAdmin(admin.ModelAdmin): 87 list_display = ('title', 'image', 'min_money', 'price', 'end_time') # 显示为表结构包括所有的列 88 search_fields = ['title'] # 出现搜索框, 指定搜索哪一列字段 89 90 # 在django中我们没有创建对数据库的查询操作和页面返回,但是调用rest framework标准的api接口我们就可以直接从数据库中查询到数据,增删改查都是可以的!实现起来如此简单! 91 92 93 ###### setting.py配置 94 REST_FRAMEWORK = { 95 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',), 96 'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',), 97 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 98 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning', 99 'DEFAULT_VERSION': '160201', 100 'PAGE_SIZE': 10, # 每页10条数据 101 'DEFAULT_AUTHENTICATION_CLASSES': ( 102 'rest_framework.authentication.SessionAuthentication', 103 'rest_framework.authentication.TokenAuthentication', 104 ), 105 } 106 107 108 109 110 ####################################################################### 111 # 为查询到的数据增加相关联的字段!! 正查!! 112 ####################################################################### 113 # models.py 114 class Goods(models.Model): 115 name = models.CharField(max_length=128) 116 price = models.CharField(max_length=56, blank=True, null=True) 117 118 119 class Index(models.Model): 120 goods = models.ForeignKey(Goods, verbose_name="Goods") 121 start_at = models.DateTimeField() 122 end_at = models.DateTimeField() 123 124 125 # serializers.py 126 class GoodsSerializers(serializers.HyperlinkedModelSerializer): 127 class Meta: 128 model = Goods 129 fields = ('name', 'price') 130 131 132 class IndexSerializers(serializers.HyperlinkedModelSerializer): 133 name = serializers.ReadOnlyField(source='goods.name') # 增加外健的字段 134 price = serializers.ReadOnlyField(source='goods.price') # 添加外健的字段 135 136 class Meta: 137 model = Index 138 fields = ('goods', 'start_at', 'end_at', 'name', 'price') 139 140 141 # views.py 142 class IndexViewSet(viewsets.ReadOnlyModelViewSet): 143 queryset = Index.objects.all() 144 serializer_class = IndexSerializers 145 146 147 class GoodsViewSet(viewsets.ReadOnlyModelViewSet): 148 queryset = Goods.objects.all() 149 serializer_class = GoodsSerializers 150 151 # 结果! 商品本来只有一个url接口要起得到详细还得再查询一次.现在将详细直接加入数据中方便很多! 152 { 153 "count": 2, 154 "next": null, 155 "previous": null, 156 "results": [ 157 { 158 "goods": "http://127.0.0.1:8080/goods/1/", 159 "start_at": "2017-01-03T14:22:55Z", 160 "end_at": "2017-01-03T14:22:56Z", 161 "name": "book", 162 "price": "18.5" 163 }, 164 { 165 "goods": "http://127.0.0.1:8080/goods/2/", 166 "start_at": "2017-01-03T14:23:04Z", 167 "end_at": "2017-01-03T14:23:05Z", 168 "name": "pen", 169 "price": "34.5" 170 } 171 ] 172 } 173 174 175 176 177 ################################################################################ 178 ###### api嵌套查询, 查询外健对象的具具体内容, 而不是只显示iD 179 ###### 正查例子 180 class Column(models.Model): 181 name = models.CharField(u'类型名称', max_length=256) 182 slug = models.CharField(u'类型网址', max_length=256, db_index=True) 183 intro = models.TextField(u'类型简介', default='') 184 185 class Article(models.Model): 186 column = models.ManyToManyField(Column, verbose_name=u'分类') 187 genre = models.SmallIntegerField(u'文本<图片<视频', choices=ARTICLE_GENRE, default=ARTICLE_TXT, 188 help_text=u'文章所属类型. 优先级别视频大于图片大于文本') 189 190 # article的models里面有多对多的外健column字段 191 class ColumnSerializer(serializers.ModelSerializer): 192 class Meta: 193 model = Column 194 195 class ArticleSerializer(serializers.ModelSerializer): 196 column = ColumnSerializer(many=True, read_only=False) # 定义和外健字段重名的字段并为其指定序列化类 197 class Meta: 198 model = Article 199 fields = ('title', 'column') # 定义只操作这两列数据(如果不定义fields则默认为全部字段, 如果定义fields则 200 # _必须包含本类中定义的column字段, 否则报错) 201 202 class ArticleViewSet(viewsets.ReadOnlyModelViewSet): # view.py 203 queryset = Article.objects.all() # 查询 204 serializer_class = ArticleSerializer # 指定序列化类 205 206 207 208 209 210 ###### 反查例子: 211 # 还用上面的models为例再加个评论表, 外健分别为User, Article, 通过Article查询评论的内容如下 212 class Comment(models.Model): 213 owner = models.ForeignKey('auth.User') 214 article = models.ForeignKey(Article, related_name='comments') # 注意反查名 215 content = models.CharField(u'评论内容', max_length=1024) 216 flag = models.BooleanField(u'标记', default=True) 217 updated = models.DateTimeField(auto_now=True) 218 created = models.DateTimeField(auto_now_add=True) 219 220 class CommentSerializer(serializers.ModelSerializer): # 为此表定义序列化类 221 class Meta: 222 model = Comment 223 224 class ArticleSerializer(serializers.ModelSerializer): 225 column = ColumnSerializer(many=True, read_only=False) 226 comments = CommentSerializer(many=True, read_only=False) # 使用反查名指定序列化类 227 class Meta: 228 model = Article 229 230 class ArticleViewSet(viewsets.ReadOnlyModelViewSet): # view.py 231 queryset = Article.objects.all() # 查询 232 serializer_class = ArticleSerializer # 指定序列化类 233 def get_queryset(self): # 过滤函数 234 return self.queryset.filter(end_time__gt=timezone.now()) 235 236 237 238 239 240 ################################################################################ 241 ######关于class Meta的其它功能 242 class ArticleSerializer(serializers.ModelSerializer): 243 column = ColumnSerializer(many=True, read_only=False) # 定义和外健字段重名的字段并为其指定序列化类 244 class Meta: 245 model = Article # 定义对应的model 246 247 exclude = ('id', ) # 定义排除这几列数据 248 249 fields = ('title', 'column') # 定义只操作这两列数据(如果不定义,默认是全部数据) 250 251 read_only_fields = ('id', 'user') # 定义这几列数据是只读的
转载于:https://www.cnblogs.com/zyu911/p/6254402.html
Django rest_framework 实用技巧相关推荐
- CSS实用技巧第一讲:文字处理
前言 作为程序员的我们,书写代码也需要大量的技巧.一份良好的代码能让人耳目一新,让人容易理解,同时也让自己成就感满满.因此,在这里简单的整理一些CSS开发技巧,希望能让你写出耳目一新.容易理解.舒服自 ...
- 深度学习11个实用技巧
深度学习11个实用技巧 深度学习工程师George Seif发表了一篇博文,总结了7个深度学习的技巧,本文增加了几个技巧,总结了11个深度学习的技巧,主要从提高深度学习模型的准确性和速度两个角度来分析 ...
- 【老鸟分享】Linux命令行终端提示符多种实用技巧!
1.Linux命令行提示符简介 众所周知,Linux命令行是系统管理员管理Linux的重要手段,我们管理Linux,首先要面对的就是Linux命令行提示符. Linux命令行结尾的提示符有" ...
- 经典 | 深度学习的7大实用技巧
编译 | AI科技大本营 参与 | 林椿眄 编辑 | 谷 磊 对于许多具有挑战性的现实问题,深度学习已经成为最有效的解决方法. 例如,对于目标检测,语音识别和语言翻译等问题,深度学习能够表现出最佳的性 ...
- 深度学习七个实用技巧
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 深度学习已经成为解决许多具有挑战性的现实世界问题的方法.对目标检测 ...
- Python大神用的贼溜,9个实用技巧分享给你
来源:数据分析1480 本文约3000字,建议阅读6分钟 本文为你介绍一些关于python的实用技巧. 本文会试着介绍一些其它文章没有提到的小技巧,这些小技巧也是我平时会用到的的.让我们一探究竟吧! ...
- 5 个针对有经验用户的 Vim 实用技巧
Vim 编辑器提供了很多的特性,要想全部掌握它们很困难.然而,花费更多的时间在命令行编辑器上总是有帮助的.毫无疑问,和 Vim 用户们进行交流能够让你更快地学习新颖有创造性的东西. 注: 本文中用到的 ...
- ES6的几个实用技巧,你了解吗?
本文给大家分享了es6的几个实用技巧,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧 Hack #1 交换元素 利用 数组解构来实现值的互换 let a = 'world', b = 'hello ...
- 在此处打开命令窗口_这样操作方便多了!简单DOS命令实用技巧详解
分享简单DOS命令实用技巧,让我们的工作.生活更加方便快捷.小编致力于分享分享智能数码.弱电组网.电脑软硬件资讯及实用技巧. 先跟着小编一起来了解一下DOS命令是一个什么样子的存在?技术大牛,请忽略, ...
最新文章
- CI框架验证码CAPTCHA 辅助函数的使用
- HNU 2015暑期新队员训练赛2 H Blanket
- hdu4662 简单搜索打表
- mysql模糊查询不会区分大小写_MySQL模糊查询(like)时区分大小写
- Oracle SQL Trace 和 10046 事件 .
- python2与python3共存_【python】--python2与python3 共存
- 基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析
- 安卓学习之路之如何显示一个listview列表视图
- IE8中如何添加Activity
- brew安装_解决安装brew报的curl的443错误
- FFmpeg合并多个ts视频文件
- java定义负数_java如何定义负数
- Linux软件安装包保存
- 国产磁力架的用途,特点和使用方法
- [技术讨论]为什么运算放大器有共模输入电压范围限制呢,详解在这里
- 学生实验室常见升压降压芯片电路介绍
- 网文如何偷走了我的时间?
- 全球Flickr地理标记数据,含经纬度
- Android应用《撕开美女衣服》的实现过程及源代码
- qt qrc html,写一个QT资源文件(qrc)
热门文章
- python菜鸟教程官网绘图-NumPy Matplotlib
- python输入语句-python输入语句
- python打不开-安装的python为什么打不开
- python面试常见问题-Python面试中常见的40个问题
- python爬虫吧-Python爬虫——抓取贴吧帖子
- 笔记本电脑下载python视频教程-如何使用Python访问/下载OneNote笔记本?
- 学python需要什么文化基础-人工智能对人类有哪些影响 选择Python入门怎样
- python学会了能做什么-学会Python后都能做什么?介绍五种Python的实用场景
- 学python要多少钱-培训python大概要多少钱?
- 写python程序用什么软件最好-Python必学之编译器用哪个好?你用错了吧!