zl程序教程

您现在的位置是:首页 >  后端

当前栏目

一个比较全面的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 复制代码

forms.py

复制代码
__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, )
复制代码

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 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, )
复制代码

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


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(...