前言:

  最近工作中需要用到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必知必会14--组合查询

    14.1 组合查询 复合查询(compound query)或并(union),SQL允许执行多个查询(多条SELECT语句),并将结果作为一个查询结果集返回. 应用场景: 在一个查询中从不同的表返回 ...

  2. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  3. angularjs和ajax的结合使用 (一)

    好久没写文了.这是一篇关于easyui配合ajax使用 的文章, 顺带介绍angularjs的使用 以及让你感受到angularjs的威力.网上对于ajax 的文也是多如牛毛 .我就不直接 从那种原生 ...

  4. MVC发布到虚拟主机上出现的错误

    问题1:无法识别的属性“targetFramework”.请注意属性名称区分大小写. 现象:无法识别的属性“targetFramework”.请注意属性名称区分大小写. 原因:站点中部署的Web使用的 ...

  5. 【Oracle基本操作1】 数据库的新建删除

    一.新建数据库 1.新建数据库. 1.1打开 Database Configuration Assistant  : 1.2选择新建数据库,下一步,选第一个"一般用途或事物处理": ...

  6. php中实现的一个curl批处理的实例

    curl是利用URL语法在命令行方式下工作的开源文件传输工具 本文在php中实现了的一个curl批处理的实例. 代码如下: header("Content-Type:text/html;ch ...

  7. java访问修饰符

    了解面向对象思想的同学们,都知道"封装"这一基本特征,如何正确运用访问修饰符,恰恰能体现出封装的好坏. java访问修饰符有四个: 1)public:访问权限最高,其修饰的类.类变 ...

  8. [连载]《C#通讯(串口和网络)框架的设计与实现》- 13.中英文版本切换设计

    目       录 第十三章     中英文版本切换设计... 2 13.1        不用自带的资源文件的理由... 2 13.2        配置文件... 2 13.3        语言 ...

  9. javaScript之BOM操作2

    <!doctype html> <html lang="en"> <head> <title>Document</title& ...

  10. Date小技巧:set相关操作及应用_获取当前月(季度/年)的最后一天

    set操作还是有不少的,具体见 http://www.w3school.com.cn/jsref/jsref_obj_date.asp, 今天我就只说 setFullYear, setMonth, s ...