前言:

  最近工作中需要用到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. 7.JAVA之GUI编程鼠标事件

    鼠标事件: 功能: 1.基本窗体功能实现 2.鼠标移动监听,当鼠标移动到按钮上时,触发打印事件. 3.按钮活动监听,当按钮活动时,触发打印事件. 4.按钮被单击时触发打印事件. 源码如下: impor ...

  2. C#组件系列———又一款日志组件:Elmah的学习和分享

    前言:好久没动笔了,都有点生疏,12月都要接近尾声,可是这月连一篇的产出都没有,不能坏了“规矩”,今天还是来写一篇.最近个把月确实很忙,不过每天早上还是会抽空来园子里逛逛.一如既往,园子里每年这个时候 ...

  3. ASP.NET MVC5中的Model验证

    Model验证是ASP.NET MVC中的重要部分,它主要用于判断输入的数据类型及值是否符合我们设定的规则,这篇文章就介绍下ASP.NET MVC中Model验证的几种方式. 后台验证 DataAnn ...

  4. TeamCity : 自动触发 Build

    创建了 build 的配置以后,您既可以手动点击 "Run" 按钮来触发一次 build 过程,也可以通过 Triggers 配置实现自动触发 build 过程.一个 trigge ...

  5. MVC5+EF6+AutoMapper+Bootstrap打造在线博客(1.1)

    DAL层的三个Model类: 字典表:CFDict 用户表:CFUser 用户爱好表:CFUserHobby(关联cfuser表和cfdict表) CFUser表和CFUserHobby表是一对多关系 ...

  6. ViEmu 3.6.0 过期 解除30天限制的方法

    下载:链接: http://pan.baidu.com/s/1c2HUuWw 密码: sak8 删除下面2个地方 HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{B9CDA4 ...

  7. discuz模板语法

    Discuz! X 模板的解析主要是 ./source/class/class_template.php 文件解析处理的,如果需要深入了解请可以看看这个文件! 模板嵌套语法 将被嵌套模板内容解析为 P ...

  8. MYSQL基础知识和操作(二).png

  9. js 压缩工具总结

    随便百度一个 “js 压缩”,然后就会有各种代码压缩工具可供选择, 向来我就爱那种绚丽新颖的玩意,比如这家显示压缩比呀,或者那家可以查错呀什么的, 今天还为国民浏览器拥有鼠标手势(按住右键画个图形就有 ...

  10. ssh改https为ssh

    第一:设置Git的user name和email: 第二:然后生成key 这里会生成两个文件 id_rsa 和 id_rsa.pub 第三:登录你的GITHUB账号 看下图 第四:测试下是否成功 第五 ...