一个比较全面的DJANGO_REST_FRAMEWORK的CASE

验证啊,过滤啊,hypermedia as the engine of ap‐plication state (HATEOAS)啊都有的。

urls.py

__author__ = 'sahara'
from rest_framework.routers import DefaultRouter
from . import views

router = DefaultRouter()
router.register(r'sprints', views.SprintViewSet)
router.register(r'tasks', views.TaskViewSet)
router.register(r'users', views.UserViewset)

models.py

# Create your models here.

from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.conf import settings

class Sprint(models.Model):
    """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

class Task(models.Model):
    """Unit of work to be done for the sprint."""
    STATUS_TODO = 1
    STATUS_IN_PROGRESS = 2
    STATUS_TESTING = 3
    STATUS_DONE = 4
    STATUS_CHOICES = (
        (STATUS_TODO, _('Not Started')),
        (STATUS_IN_PROGRESS, _('In Progress')),
        (STATUS_TESTING, _('Testing')),
        (STATUS_DONE, _('Done')),
    )
    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

forms.py

__author__ = 'sahara'
import django_filters
from .models import Task, Sprint
from django.contrib.auth import get_user_model

User = get_user_model()

class NullFilter(django_filters.BooleanFilter):
    def filter(self, qs, value):
        if value is not None:
            return qs.filter(**{'%s__isnull' % self.name: value})
        return qs

class TaskFilter(django_filters.FilterSet):
    backlog = NullFilter(name='sprint')

    class Meta:
        model = Task
        fields = ('sprint', 'status', 'assigned','backlog', )

    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', )

serializers.py

__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),
        }

views.py

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 DefaultsMixin(object):
    authentication_classes = (
        authentication.BasicAuthentication,
        authentication.TokenAuthentication,
    )
    permission_classes = (
        permissions.IsAuthenticated,
    )
    paginate_by = 25
    paginate_by_param = 'page_size'
    max_paginate_by = 100
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
        filters.OrderingFilter,
    )

class SprintViewSet(DefaultsMixin, viewsets.ModelViewSet):
    queryset = Sprint.objects.order_by('end')
    serializer_class = SprintSerializer
    filter_class = SprintFilter
    search_fields = ('name', )
    ordering_fields = ('end', 'name', )

class TaskViewSet(DefaultsMixin, viewsets.ModelViewSet):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer
    filter_class = TaskFilter
    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, )

截图,注意有相关链接哟。

时间: 2024-08-30 22:29:24

一个比较全面的DJANGO_REST_FRAMEWORK的CASE的相关文章

一个非常全面的javascript URL解析函数和分段URL解析方法_javascript技巧

一.URL解析函数 复制代码 代码如下: <script>  /** *@param {string} url 完整的URL地址 *@returns {object} 自定义的对象 *@description 用法示例:var myURL = parseURL('http://abc.com:8080/dir/index.html?id=255&m=hello#top'); myURL.file='index.html' myURL.hash= 'top' myURL.host= 'a

一个全面的PHP整站防注入程序

SQL注入攻击的总体思路 ·发现SQL注入位置: ·判断后台数据库类型: ·确定XP_CMDSHELL可执行情况 ·发现WEB虚拟目录 ·上传ASP,php,jsp木马: ·得到管理员权限: <?PHP //PHP整站防注入程序,需要在公共文件中require_once本文件 //判断magic_quotes_gpc状态  代码如下 复制代码 if (@get_magic_quotes_gpc ()) { $_GET = sec ( $_GET ); $_POST = sec ( $_POST

研究心得-------&amp;gt;CPU信息的获得,比较全面的

比较|心得 最近到整理了一份CPU的信息,应该算是比较全面的吧.几乎现在所有的X86 CPU都内置了CPUID指令以辨别真伪,一些CPU厂商例如AMD,VIA等还内置了更加丰富的扩展CPUID指令,用着更方便了.下面我们利用Delphi来实现一个CPU检测的软件.CPUID的调用方式如下: asm push eax push ebx push ecx push edx mov eax,X//*****************************************************

javascript-js判断一个list里面的applyform对象中的两个日期是否有重复部分?

问题描述 js判断一个list里面的applyform对象中的两个日期是否有重复部分? js判断一个list里面的applyform对象中的两个日期是否有重复部分,求思路和代码,谢谢 解决方案 js判断两个对象是否全等 解决方案二: for遍历list进行对比 var arr = [{ d: '2015-10-12' }, { d: '2015-10-14' }, { d: '2015-10-12' }]; var find = false; for (var i = 0; i < arr.le

Arbor Networks凭借业界全面的 DDoS 防御组合为各类客户提供可用性保护

Arbor Networks Inc.,NETSCOUT的安全部门近日宣布推出用于DDoS防护的业界全面的产品和服务组合,提供强大的可扩展性.部署和成本灵活性,满足任何组织的需求,从最大的服务供应商到中小型规模的新兴成长型企业. "这是Arbor史上最强大.最广泛且最大胆的DDoS组合,它将成为未来十年DDoS市场上领先的平台"Arbor Networks总裁Matthew Moynahan说道."我们扩展新的组合以满足最大的服务供应商的需求,同时提供更广阔的企业市场所需的部

实时的数据中心监控:全面的DCIM解决方案创造了丰富的连通环境

数据中心基础设施管理(DCIM)是一种新兴的数据中心管理形式,其弥合了传统设施系统和信息技术(IT)系统之间的差距,从而为数据中心运营商们提供了从每个系统所收集到的数据的整合. 虽然 "DCIM"这一缩写早已经成为数据中心管理词典的一部分了.但是,在开发真正全面的软件应用程序解决方案的紧迫感方面却仍然是一种比较新兴的现象.随着数据中心的管理效率和成本的增加,这些专业设施的足迹日益增加,以便应对新技术的爆炸式增长,包括手持设备和平板电脑的增长,而这一点也越来越受到重视.云计算和虚拟化技术

我正用C#编写一个多页面的IE浏览器,谁知道怎么实现打开HTML文件的功能?

问题描述 我正用C#编写一个多页面的IE浏览器,谁知道怎么实现打开HTML文件的功能?我用的是webBrowser控件,实现打开HTML文件并且在我做的IE下浏览的功能... 解决方案 解决方案二:up解决方案三:webBrowser.url="";//Localpathofyourhtmlfile.解决方案四:不知你实现了打开_ablank的也在自己的浏览器中打开了?

进制转换-java怎么把一个数组里面的16进制值转换成8进制,我想先把16进制转成2进制再转8进制

问题描述 java怎么把一个数组里面的16进制值转换成8进制,我想先把16进制转成2进制再转8进制 java怎么把一个数组里面的16进制值转换成8进制,我想先把16进制转成2进制再转8进制,但是老是运行出错.大神们能不能给个小例子解释一下,谢谢 解决方案 http://blog.csdn.net/vanezuo/article/details/6556768 解决方案二: 使用函数啊,你找一下,Java有相应的函数能做到 解决方案三: 如果你的程序出错,你贴出你的程序才知道. 也可以参考我给你的

java-easyui中设置多选框,我选择任意一个都会全选,求大神解答一下,在线等

问题描述 easyui中设置多选框,我选择任意一个都会全选,求大神解答一下,在线等 easyui中设置多选框,我选择任意一个都会全选,求大神解答一下,在线等 解决方案 不可能.只有勾选标题的那个复选框才会选中所有的记录前面的复选框 解决方案二: 你把你的checkbox 做一个循环 判断是否有勾选 只要有勾选 就把其他的也设置上 解决方案三: 既然使用easyUI 为这些多选框添加相同的一个click处理就是 $("#checkbox1,checkbox2......").click(