前言:

  最近工作中需要用到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. 你真的会玩SQL吗?三范式、数据完整性

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  2. Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架

    最近因项目需要,我自己设计开发了一个基于Windows Forms的向导开发框架,目前我已经将其开源,并发布了一个NuGet安装包.比较囧的一件事是,当我发布了NuGet安装包以后,发现原来已经有一个 ...

  3. 分享:使用 TypeScript 编写的 JavaScript 游戏代码

    <上篇博客>我写出了我一直期望的 JavaScript 大型程序的开发模式,以及 TS(TypeScript) 的一些优势.博客完成之后,我又花了一天时间试用 TS,用它来重构之前编写的一 ...

  4. 利用javascript跨域访问cookie之广告推广

    在上一篇<说一说javascript跨域和jsonp>中,利用JSONP进行了跨域的数据访问,利用JS本身的跨域能力在远端生成HTML结构的方式完成了一个小广告. 在实际应用中, 跨域使用 ...

  5. react-native学习笔记--史上最详细Windows版本搭建安装React Native环境配置

    参考:http://www.lcode.org/react-native/ React native中文网:http://reactnative.cn/docs/0.23/android-setup. ...

  6. Debian8安装Vim8

    1 安装vim需要的库 apt-get build-dep vim-gtk apt-get install libncurses5-dev mercurial   2 下载Vim8 apt-get i ...

  7. Linux下安装Redis

    1. 下载最新版本的Redis源代码: 命令:wget http://download.redis.io/redis-stable.tar.gz 2. 解压并编译 命令:tar xzf redis-s ...

  8. 充电时间 Go中的数组、切片、map简单示例

    数组是固定长度的,依稀让我想起了VB:切片是动态的:map一般是键值对 package main import ( "fmt" ) func main() { var userna ...

  9. 9.6 MongoDB一

    目录:ASP.NET MVC企业级实战目录 9.6.1 MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统 ...

  10. 【干货分享】前端面试知识点锦集01(HTML篇)——附答案

    一.HTML部分 1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript作用:HTML实现页面结构,CSS完成页面的表现与风格 ...