一个比较全面的DJANGO_REST_FRAMEWORK的CASE
django 一个 比较 全面 Framework rest case
2023-09-14 08:59:37 时间
"""Development iteration period."""
name = models.CharField(max_length=100, blank=True, default=)
description = models.TextField(blank=True, default=)
end = models.DateField(unique=True)
def __unicode__(self):
return self.name or _(Sprint ending %s) % self.end
name = models.CharField(max_length=100) description = models.TextField(blank=True, default=) sprint = models.ForeignKey(Sprint, blank=True, null=True) status = models.SmallIntegerField(choices=STATUS_CHOICES, default=STATUS_TODO) order = models.SmallIntegerField(default=0) assigned = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) started = models.DateField(blank=True, null=True) due = models.DateField(blank=True, null=True) completed = models.DateField(blank=True, null=True) def __unicode__(self): return self.name
Django-rest-framework 是个什么鬼? 我们首先来回顾一下传统的基于模板引擎的 django 开发工作流: 绑定 URL 和视图函数。当用户访问某个 URL 时,调用绑定的视图函数进行处理。 编写视图函数的逻辑。视图中通常涉及数据库的操作。 在视图中渲染 HTML 模板,返回 HTTP 响应。 其实,基于 django-rest-framework 的 RESTful API 的开发,过程是完全类似的: 绑定 URL 和视图函数。当用户访问某个 URL 时,调用绑定的视图函数进行处理。 编写视图函数的逻辑,根据 HTTP 请求类型,对请求的资源进行相应操作,这个过程通常涉及数据库的操作。 使用约定的资源描述格式(例如 XML 或
Django Rest Framework动态获取字段 项目名称 drf-dynamic-fields 提供了一个mixin,用于serializer,实现动态配置返回字段的效果。在获取数据的API的时候,在URL中加入一个查询字段fields,用来过滤返回数据的字段,减少网络传输的数据。
带你读《Python Django Web典型模块 开发实战》之二:用Django REST framework实现 本书内容涵盖了收费API业务模型的开发、网站防爬虫策略、网站违禁词自查系统的搭建、会员系统的搭建、前后端分离项目的上线部署等大大小小十余个项目模块分析,可以基本解决Django学习者从理论到实践过渡过程中经常会遇到的大部分问题。
Django REST framework中的版本控制 1.REST framework版本控制的流程分析 1.1 determine_version方法的执行流程 首先,请求到达REST framework的CBV,执行CBV中的dispatch方法再次封装完成request后,执行initial方法.
源码剖析Django REST framework的请求生命周期 学习Django的时候知道,在Django请求的生命周期中,请求经过WSGI和中间件到达路由,不管是FBV还是CBV都会先执行View视图函数中的dispatch方法 REST framework是基于Django的API框架,REST framework采用的是CBV的请求模式.
Django REST framework反向生成url Django REST framework是一个基于Django的框架,REST framework又是怎么反向生成url的呢?? 在前面的例子中,知道在REST framework中有6种版本控制的方式,进入任意一种版本控制的源码中, class QueryParameterVersioning(...
name = models.CharField(max_length=100) description = models.TextField(blank=True, default=) sprint = models.ForeignKey(Sprint, blank=True, null=True) status = models.SmallIntegerField(choices=STATUS_CHOICES, default=STATUS_TODO) order = models.SmallIntegerField(default=0) assigned = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) started = models.DateField(blank=True, null=True) due = models.DateField(blank=True, null=True) completed = models.DateField(blank=True, null=True) def __unicode__(self): return self.name
![复制代码](http://common.cnblogs.com/images/copycode.gif)
forms.py
![复制代码](http://common.cnblogs.com/images/copycode.gif)
__author__ = sahara import django_filters from .models import Task, Sprint from django.contrib.auth import get_user_model
def __init__(self, *args, **kwargs): super(TaskFilter, self).__init__(*args, **kwargs) self.filters[assigned].extra.update( {to_field_name: User.USERNAME_FIELD} class SprintFilter(django_filters.FilterSet): end_min = django_filters.DateFilter(name=end, lookup_type=gte) end_max = django_filters.DateFilter(name=end, lookup_type=lte) class Meta: model = Sprint field = (end_min, end_max, )
![复制代码](http://common.cnblogs.com/images/copycode.gif)
serializers.py
![复制代码](http://common.cnblogs.com/images/copycode.gif)
__author__ = sahara from django.contrib.auth import get_user_model from rest_framework import serializers from rest_framework.reverse import reverse from .models import Sprint, Task from datetime import date from django.utils.translation import ugettext_lazy as _ User = get_user_model() class SprintSerializer(serializers.ModelSerializer): links = serializers.SerializerMethodField() class Meta: model = Sprint fields = (id, name, description, end, links, ) def get_links(self, obj): request = self.context[request] return { self: reverse(sprint-detail, kwargs={pk: obj.pk}, request=request), tasks: reverse(task-list, request=request) + ?sprint={}.format(obj.pk), def validate_end(self, attrs): end_date = attrs # new = not self.object #changed = self.object and self.object.end != end_date if (end_date date.today()): msg = _(End date cannot be in the past.) raise serializers.ValidationError(msg) return attrs class TaskSerializer(serializers.ModelSerializer): assigned = serializers.SlugRelatedField( slug_field=User.USERNAME_FIELD, required=False, read_only=True, ) status_display = serializers.SerializerMethodField() links = serializers.SerializerMethodField() class Meta: model = Task fields = (id, name, description, sprint, status, status_display, order, assigned, started, due, completed, links, ) def get_status_display(self, obj): return obj.get_status_display() def get_links(self, obj): request = self.context[request] links = { self: reverse(task-detail, kwargs={pk: obj.pk}, request=request), sprint: None, assigned: None, if obj.sprint_id: links[sprint] = reverse(sprint-detail, kwargs={pk: obj.sprint_id}, request=request) if obj.assigned: links[assigned] = reverse(user-detail, kwargs={User.USERNAME_FIELD: obj.assigned}, request=request) return links def validate_sprint(self, attrs): sprint = attrs if self : pass if sprint != self.sprint: if self.status == Task.STATUS_DONE: msg = _(Cannot change the sprint of a completed task.) raise serializers.ValidationError(msg) if sprint and sprint.end date.today(): msg = _(Cannot assign task to passed sprint) raise serializers.ValidationError(msg) else: if sprint and sprint.end date.today(): msg = _(Cannot add tasks to past sprints.) raise serializers.ValidationError(msg) return attrs def validate(self, attrs): sprint = attrs.get(sprint) status = int(attrs.get(status)) started = attrs.get(started) completed = attrs.get(completed) if not sprint and status != Task.STATUS_TODO: msg = _(Backlog tasks must have "Not Started" status.) raise serializers.ValidationError(msg) if started and status == Task.STATUS_TODO: msg = _(Started date cannot be set for not started tasks.) raise serializers.ValidationError(msg) if completed and status != Task.STATUS_DONE: msg = _(Completed date cannot be set for uncompleted tasks.) raise serializers.ValidationError(msg) return attrs class UserSerializer(serializers.ModelSerializer): full_name = serializers.CharField(source=get_full_name, read_only=True) links = serializers.SerializerMethodField() class Meta: model = User fields = (id, User.USERNAME_FIELD, full_name, is_active, links, ) def get_links(self, obj): request = self.context[request] user_name = obj.get_username() return { self: reverse(user-detail, kwargs={User.USERNAME_FIELD: user_name}, request=request), tasks: {}?assigned={}.format( reverse(task-list, request=request), user_name), }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
views.py
![复制代码](http://common.cnblogs.com/images/copycode.gif)
from django.contrib.auth import get_user_model from rest_framework import viewsets, authentication, permissions, filters from .forms import TaskFilter, SprintFilter from .models import Sprint, Task from .serializers import SprintSerializer, TaskSerializer, UserSerializer # Create your views here. User = get_user_model()
class SprintViewSet(DefaultsMixin, viewsets.ModelViewSet): queryset = Sprint.objects.order_by(end) serializer_class = SprintSerializer filter_class = SprintFilter search_fields = (name, ) ordering_fields = (end, name, )
search_fields = (name, description, ) ordering_fields = (name, order, started, due, completed, )
class UserViewset(DefaultsMixin, viewsets.ReadOnlyModelViewSet): lookup_field = User.USERNAME_FIELD lookup_url_kwarg = User.USERNAME_FIELD queryset = User.objects.order_by(User.USERNAME_FIELD) serializer_class = UserSerializer search_fields = (User.USERNAME_FIELD, )
![复制代码](http://common.cnblogs.com/images/copycode.gif)
截图,注意有相关链接哟。
Django-rest-framework 是个什么鬼? 我们首先来回顾一下传统的基于模板引擎的 django 开发工作流: 绑定 URL 和视图函数。当用户访问某个 URL 时,调用绑定的视图函数进行处理。 编写视图函数的逻辑。视图中通常涉及数据库的操作。 在视图中渲染 HTML 模板,返回 HTTP 响应。 其实,基于 django-rest-framework 的 RESTful API 的开发,过程是完全类似的: 绑定 URL 和视图函数。当用户访问某个 URL 时,调用绑定的视图函数进行处理。 编写视图函数的逻辑,根据 HTTP 请求类型,对请求的资源进行相应操作,这个过程通常涉及数据库的操作。 使用约定的资源描述格式(例如 XML 或
Django Rest Framework动态获取字段 项目名称 drf-dynamic-fields 提供了一个mixin,用于serializer,实现动态配置返回字段的效果。在获取数据的API的时候,在URL中加入一个查询字段fields,用来过滤返回数据的字段,减少网络传输的数据。
带你读《Python Django Web典型模块 开发实战》之二:用Django REST framework实现 本书内容涵盖了收费API业务模型的开发、网站防爬虫策略、网站违禁词自查系统的搭建、会员系统的搭建、前后端分离项目的上线部署等大大小小十余个项目模块分析,可以基本解决Django学习者从理论到实践过渡过程中经常会遇到的大部分问题。
Django REST framework中的版本控制 1.REST framework版本控制的流程分析 1.1 determine_version方法的执行流程 首先,请求到达REST framework的CBV,执行CBV中的dispatch方法再次封装完成request后,执行initial方法.
源码剖析Django REST framework的请求生命周期 学习Django的时候知道,在Django请求的生命周期中,请求经过WSGI和中间件到达路由,不管是FBV还是CBV都会先执行View视图函数中的dispatch方法 REST framework是基于Django的API框架,REST framework采用的是CBV的请求模式.
Django REST framework反向生成url Django REST framework是一个基于Django的框架,REST framework又是怎么反向生成url的呢?? 在前面的例子中,知道在REST framework中有6种版本控制的方式,进入任意一种版本控制的源码中, class QueryParameterVersioning(...
相关文章
- Django模板引擎中变量作为属性值调用
- 一个提供公告和打赏功能的 django 应用插件 django-tctip
- Django学习笔记一初识Django
- 最简单的 Django 教程
- 使用python的Django库开发一个简单的数据可视化网站(三)- 使用Django连接数据库mysql
- 创建一个Django项目
- Django(14)模型中常用的属性(超详细)[通俗易懂]
- Django-REST-framework 权限管理源码分析
- Python Django 编程 | 连载 03 - Django 视图
- 【Django】在大型项目中的django的性能模型字段primary_key
- 后端框架学习-Django
- 用Python Django建一个issue跟踪管理网站(一)Django的安装和使用
- Django admin 多对多字段 过滤方法 及 保持横向显示(穿梭框)
- Django REST Framework-视图集类型(一)
- mysql主从基于docker和django实现读写分离
- Django上传图片生成成缩略图的类详解编程语言
- django 执行原生的sql详解编程语言
- Django中的forms一些小点详解编程语言
- Django 采用新的项目治理模式
- 如何借助 Django 来编写一个 Python Web API
- 深入浅出Django与MSSQL整合(django-mssql)
- 使用django-suit为django1.7admin后台添加模板
- Python开发WebService系列教程之REST,web.py,eurasia,Django