Django rest_framework 实用技巧
前言:
最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用法
####################################################################
########安装和简单使用
###### 准备工作
pip install rest_framework # 安装 INSTALLED_APPS = (
...
'rest_framework', # 将其加入app列表内
) ###### urls.py
from django.conf.urls import include, url # 引入include二级路由, url
from django.contrib import admin # admin模块
from rest_framework import routers # 导入api路由 !
import app1 # 导入app1 router = routers.DefaultRouter() # 获取api路由对象
router.register(r'users', app1.SpecialGiftViewSet)# 注册路由到指定的ViewSet类 urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include(router.urls)), # 设置api路由转发
] ###### app1/serializers.py
from rest_framework import serializers # api接口用于序列化 model 的类
from app1.models import SpecialGift # 自定义的要提供api的model类 class UserSerializer(serializers.HyperlinkedModelSerializer): # 序列化这个表的类
class Meta:
model = SpecialGift
fields = ('url', 'username', 'email', 'is_staff') # 验证字段可以省略! ---------参数扩展-----------
# HyperlinkedModelSerializer 是建立超链接关系就是外健使用 "goods": "http://127.0.0.1:8080/goods/1/"
# ModelSerializer 建立主健关系在json数据中表现为 'goods': 1
# ReadOnlyModelViewSet 未知 ####### app1/views.py 内容
from rest_framework import routers, serializers, viewsets # 分别为api的路由, 序列化, viewsets
from app1.serializers import SpecialGiftSerializer # 引入处理序列化的类
from rest_framework.permissions import AllowAny, IsAuthenticated, IsAdminUser # 用于指定权限, 所有人, 登录用户, 管理员
from app01.models import SpecialGift # 引入models类
from django.utils import timezone # 按时区的,当前时间
# from rest_framework import response class SpecialGiftViewSet(viewsets.ReadOnlyModelViewSet):
queryset = SpecialGift.objects.all().order_by('-created') # 指定默认查询方式, 按创建时间倒序
serializer_class = SpecialGiftSerializer # 指定处理序列化的类
permission_classes = [AllowAny] # 指定权限 AllowAny 为所有人 def get_queryset(self): # 过滤函数
return self.queryset.filter(end_time__gt=timezone.now()) # 过滤当前时间以前的记录 ###### app1/models.py 中写入模型定义
from django.utils.translation import ugettext_lazy as _ # Django国际化翻译 class SpecialGift(models.Model):
title = models.CharField(max_length=64)
image = VersatileImageField(_("gift_image"),
max_length=255,
upload_to=generate_upload_filename,
)
min_money = models.DecimalField(_("min_money"), max_digits=7, decimal_places=2, validators=[MinValueValidator(0)])
price = models.DecimalField(_("price"), max_digits=7, decimal_places=2, validators=[MinValueValidator(0)],
default=29.9)
end_time = models.DateTimeField() def __unicode__(self):
return self.title ###### app1/admin.py 中配置管理界面
from django.contrib import admin
from app1.models import SpecialGift admin.site.register(SpecialGift) # 简单注册每行只显示对象名 # 装饰器注册!
@admin.register(SpecialGift)
class SpecialGiftAdmin(admin.ModelAdmin):
list_display = ('title', 'image', 'min_money', 'price', 'end_time') # 显示为表结构包括所有的列
search_fields = ['title'] # 出现搜索框, 指定搜索哪一列字段 # 在django中我们没有创建对数据库的查询操作和页面返回,但是调用rest framework标准的api接口我们就可以直接从数据库中查询到数据,增删改查都是可以的!实现起来如此简单! ###### setting.py配置
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',),
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning',
'DEFAULT_VERSION': '',
'PAGE_SIZE': 10, # 每页10条数据
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
),
} #######################################################################
# 为查询到的数据增加相关联的字段!! 正查!!
#######################################################################
# models.py
class Goods(models.Model):
name = models.CharField(max_length=128)
price = models.CharField(max_length=56, blank=True, null=True) class Index(models.Model):
goods = models.ForeignKey(Goods, verbose_name="Goods")
start_at = models.DateTimeField()
end_at = models.DateTimeField() # serializers.py
class GoodsSerializers(serializers.HyperlinkedModelSerializer):
class Meta:
model = Goods
fields = ('name', 'price') class IndexSerializers(serializers.HyperlinkedModelSerializer):
name = serializers.ReadOnlyField(source='goods.name') # 增加外健的字段
price = serializers.ReadOnlyField(source='goods.price') # 添加外健的字段 class Meta:
model = Index
fields = ('goods', 'start_at', 'end_at', 'name', 'price') # views.py
class IndexViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Index.objects.all()
serializer_class = IndexSerializers class GoodsViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Goods.objects.all()
serializer_class = GoodsSerializers # 结果! 商品本来只有一个url接口要起得到详细还得再查询一次.现在将详细直接加入数据中方便很多!
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"goods": "http://127.0.0.1:8080/goods/1/",
"start_at": "2017-01-03T14:22:55Z",
"end_at": "2017-01-03T14:22:56Z",
"name": "book",
"price": "18.5"
},
{
"goods": "http://127.0.0.1:8080/goods/2/",
"start_at": "2017-01-03T14:23:04Z",
"end_at": "2017-01-03T14:23:05Z",
"name": "pen",
"price": "34.5"
}
]
} ################################################################################
###### api嵌套查询, 查询外健对象的具具体内容, 而不是只显示iD
###### 正查例子
class Column(models.Model):
name = models.CharField(u'类型名称', max_length=256)
slug = models.CharField(u'类型网址', max_length=256, db_index=True)
intro = models.TextField(u'类型简介', default='') class Article(models.Model):
column = models.ManyToManyField(Column, verbose_name=u'分类')
genre = models.SmallIntegerField(u'文本<图片<视频', choices=ARTICLE_GENRE, default=ARTICLE_TXT,
help_text=u'文章所属类型. 优先级别视频大于图片大于文本') # article的models里面有多对多的外健column字段
class ColumnSerializer(serializers.ModelSerializer):
class Meta:
model = Column class ArticleSerializer(serializers.ModelSerializer):
column = ColumnSerializer(many=True, read_only=False) # 定义和外健字段重名的字段并为其指定序列化类
class Meta:
model = Article
fields = ('title', 'column') # 定义只操作这两列数据(如果不定义fields则默认为全部字段, 如果定义fields则
# _必须包含本类中定义的column字段, 否则报错) class ArticleViewSet(viewsets.ReadOnlyModelViewSet): # view.py
queryset = Article.objects.all() # 查询
serializer_class = ArticleSerializer # 指定序列化类 ###### 反查例子:
# 还用上面的models为例再加个评论表, 外健分别为User, Article, 通过Article查询评论的内容如下
class Comment(models.Model):
owner = models.ForeignKey('auth.User')
article = models.ForeignKey(Article, related_name='comments') # 注意反查名
content = models.CharField(u'评论内容', max_length=1024)
flag = models.BooleanField(u'标记', default=True)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True) class CommentSerializer(serializers.ModelSerializer): # 为此表定义序列化类
class Meta:
model = Comment class ArticleSerializer(serializers.ModelSerializer):
column = ColumnSerializer(many=True, read_only=False)
comments = CommentSerializer(many=True, read_only=False) # 使用反查名指定序列化类
class Meta:
model = Article class ArticleViewSet(viewsets.ReadOnlyModelViewSet): # view.py
queryset = Article.objects.all() # 查询
serializer_class = ArticleSerializer # 指定序列化类
def get_queryset(self): # 过滤函数
return self.queryset.filter(end_time__gt=timezone.now()) ################################################################################
######关于class Meta的其它功能
class ArticleSerializer(serializers.ModelSerializer):
column = ColumnSerializer(many=True, read_only=False) # 定义和外健字段重名的字段并为其指定序列化类
class Meta:
model = Article # 定义对应的model exclude = ('id', ) # 定义排除这几列数据 fields = ('title', 'column') # 定义只操作这两列数据(如果不定义,默认是全部数据) read_only_fields = ('id', 'user') # 定义这几列数据是只读的
Django rest_framework 实用技巧的更多相关文章
- Notepad++ 实用技巧
Notepad++是一款开源的文本编辑器,功能强大.很适合用于编辑.注释代码.它支持绝大部分主流的编程语言. 本文主要列举了本人在实际使用中遇到的一些技巧. 快捷键 自定义快捷键 首先,需要知道的是: ...
- javascript实用技巧、javascript高级技巧
字号+作者:H5之家 来源:H5之家 2016-10-31 11:00 我要评论( ) 三零网提供网络编程. JavaScript 的技术文章javascript实用技巧.javascript高级技巧 ...
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示
iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端. 打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面. ...
- iOS开发实用技巧—项目新特性页面的处理
iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...
- IOS 网络浅析-(十三 SDWebImage 实用技巧)
IOS 网络浅析-(十三 SDWebImage 实用技巧) 首先让我描述一下为了什么而产生的实用技巧.(在TableView.CollectionView中)当用户所处环境WiFi网速不够快(不能立即 ...
- NSString的八条实用技巧
NSString的八条实用技巧 有一篇文章写了:iOS开发之NSString的几条实用技巧 , 今天这篇,我们讲讲NSString的八条实用技巧.大家可以收藏起来,方便开发随时可以复制粘贴. 0.首字 ...
- ###《VIM实用技巧》
###<VIM实用技巧> #@author: gr #@date: 2015-11-20 #@email: forgerui@gmail.com <VIM实用技巧>阅读笔记. ...
- PowerDesigner实用技巧小结(3)
PowerDesigner实用技巧小结(3) PowerDesigner 技巧小结 sqlserver数据库databasevbscriptsqldomain 1.PowerDesigner 使用 M ...
随机推荐
- Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
- SQL Tuning 基础概述03 - 使用sql_trace和10046事件跟踪执行计划
1.使用sql_trace跟踪执行计划 1.1 当前session跟踪: alter session set sql_trace = true; //开始sql_trace alter session ...
- LINQ to SQL语句(19)之ADO.NET与LINQ to SQL
它基于由 ADO.NET 提供程序模型提供的服务.因此,我们可以将 LINQ to SQL 代码与现有的 ADO.Net 应用程序混合在一起,将当前 ADO.NET 解决方案迁移到 LINQ to S ...
- AutoResetEvent ManualResetEvent WaitOne使用注意事项
公司还用这些老家伙没办法,用了几次这俩.每次用都要重新翻一下A片. 好好的A片楞是翻译成了禅经.把这东西弄成个玄学.微软也是吃枣药丸.参考了@风中灵药的blog.写的牛逼. 还有一些公司用到的风中灵药 ...
- WPF 自定义ContextMenu且为左键点击显示
<Button Click="Button_Click_3" Style="{StaticResource NormalButtonStyle}"> ...
- asp.net分页控件
一.说明 AspNetPager.dll这个分页控件主要用于asp.net webform网站,现将整理代码如下 二.代码 1.首先在测试页面Default.aspx页面添加引用 <%@ Reg ...
- 【C#进阶系列】27 I/O限制的异步操作
上一章讲到了用线程池,任务,并行类的函数,PLINQ等各种方式进行基于线程池的计算限制异步操作. 而本章讲的是如何异步执行I/O限制操作,允许将任务交给硬件设备来处理,期间完全不占用线程和CPU资源. ...
- Java设计模式——线程安全的单件模式
单件模式,也称单例模式,用以创建独一无二的.只能有一个实例的对象. 单件模式的类图是所有模式的类图中最简单的--只有一个类.尽管从类设计的视角来看单件模式很简单,但是实现上还是会遇到一些问题,本文着重 ...
- PowerDesigner 常用设置
1.使用 JDBC 方式连接 Oracle 逆向生成数据库 PDM 使用 ODBC 方式连接 Oracle 数据库可以借鉴这位兄弟的博客:http://www.cnblogs.com/clivehua ...
- ThinkPHP 整合Bootstrap Ajax分页
ThinkPHP Ajax分页代码 publicfunction index() { $where=array(); $name = I('name'); if(!empty($name)){ $wh ...