前言:

  最近工作中需要用到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 实用技巧的更多相关文章

  1. Notepad++ 实用技巧

    Notepad++是一款开源的文本编辑器,功能强大.很适合用于编辑.注释代码.它支持绝大部分主流的编程语言. 本文主要列举了本人在实际使用中遇到的一些技巧. 快捷键 自定义快捷键 首先,需要知道的是: ...

  2. javascript实用技巧、javascript高级技巧

    字号+作者:H5之家 来源:H5之家 2016-10-31 11:00 我要评论( ) 三零网提供网络编程. JavaScript 的技术文章javascript实用技巧.javascript高级技巧 ...

  3. iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  4. iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示

    iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端.  打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面.   ...

  5. iOS开发实用技巧—项目新特性页面的处理

    iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...

  6. IOS 网络浅析-(十三 SDWebImage 实用技巧)

    IOS 网络浅析-(十三 SDWebImage 实用技巧) 首先让我描述一下为了什么而产生的实用技巧.(在TableView.CollectionView中)当用户所处环境WiFi网速不够快(不能立即 ...

  7. NSString的八条实用技巧

    NSString的八条实用技巧 有一篇文章写了:iOS开发之NSString的几条实用技巧 , 今天这篇,我们讲讲NSString的八条实用技巧.大家可以收藏起来,方便开发随时可以复制粘贴. 0.首字 ...

  8. ###《VIM实用技巧》

    ###<VIM实用技巧> #@author: gr #@date: 2015-11-20 #@email: forgerui@gmail.com <VIM实用技巧>阅读笔记. ...

  9. PowerDesigner实用技巧小结(3)

    PowerDesigner实用技巧小结(3) PowerDesigner 技巧小结 sqlserver数据库databasevbscriptsqldomain 1.PowerDesigner 使用 M ...

随机推荐

  1. css或者js文件后面跟着参数

    以前一直不懂,看到某某网站上面css链接 ?v=20130203类似这样的 后来发现是为了避免浏览器读取缓存而采取的强制刷新缓存的办法. “比如新浪首页在2010年4月5日改版,只是改变CSS样式表, ...

  2. TeamCity : 配置 Build 过程

    Build 过程往往是比较复杂的,因此 TeamCtiy 通过 build 步骤的方式让您可以实现不同的应用场景.您可以在每个 build 步骤中只做一件事情,然后把一系列的 build 步骤组织起来 ...

  3. DataGridView绑定源码下载

    效果图: 源码下载:http://hovertree.com/h/bjaf/bbot18bj.htm 上面源码不包含数据库的查询,需要获取数据库数据的话,请看这个的源码: http://hovertr ...

  4. 【译】Asp.net mvc 使用ITextSharp PDF to HTML (解决img标签问题)

    前言:因项目需求,需要将HTML代码转成PDF.大致上已经实现了,可以是发现使用ITextSharp(我现在的版本是5.5.9)的时候,img标签中的src只能跟绝对路径. 在百度上找了一个上午,有一 ...

  5. Java 程序员们值得一看的好书推荐

    "学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一 ...

  6. 初识Servlet

    1.创建DispatcherServlet package myservlet; import java.io.IOException; import javax.servlet.ServletExc ...

  7. 使用Mavne生成可以执行的jar文件

    到目前为之,还没有运行HelloWorld的项目,不要忘了HelloWorld类可是有一个main方法的.使用mvn clean install命令默认生成的jar 包是不能直接运行的.因为带有mai ...

  8. 和transformjs一起摇摆

    写在前面 记得以前facebook做过一款HTML5游戏.开场动画是一块软体类似豆腐的东西一起摇摆.类似的效果如下面的gif所示: facebook当时使用的是createjs下的子项目easeljs ...

  9. 开发属于自己的yeoman脚手架(generator-reactpackage)

    自从前后端开始分离之后,前端项目工程化也显得越来越重要了,之前写过一篇搭建基于Angular+Requirejs+Grunt的前端项目教程,有兴趣的可以点这里去看 但是有些项目可以使用这种方式,但有些 ...

  10. 转载---javascript 定时器总结

    转载:http://www.jb51.net/article/40193.htm JS里设定延时: 使用SetInterval和设定延时函数setTimeout 很类似.setTimeout 运用在延 ...