django-rest-framework 常用视图函数

目录[-]

settings.py

<pre style="box-sizing: border-box; overflow: auto; font: 12px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; display: block; padding: 16px; margin: 0px 0px 16px; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: normal; background-color: rgb(245, 245, 245); border: 1px solid rgb(187, 187, 187); border-radius: 3px;">REST_FRAMEWORK = {
# 设置分页
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning',
'DEFAULT_PERMISSOIN_CLASSES':[
'rest_framework.permissions.IsAdminUser',
],
# 每一页数量
'PAGE_SIZE': 10
}
</pre>

models.py

<pre style="box-sizing: border-box; overflow: auto; font: 12px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; display: block; padding: 16px; margin: 0px 0px 16px; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: normal; background-color: rgb(245, 245, 245); border: 1px solid rgb(187, 187, 187); border-radius: 3px;">from django.db import models

SEX_CHOICES = (
(1, '男'),
(2, '女')
)

class Classes(models.Model):
name = models.CharField(max_length=32)

def __str__(self):
    return self.name

class Student(models.Model):
name = models.CharField(max_length=16, null=False, verbose_name='学生姓名')
sex = models.CharField(max_length=16, choices=SEX_CHOICES, default=1)
classes = models.ForeignKey(Classes, on_delete=models.CASCADE)

def __str__(self):
    return self.name

class Course(models.Model):
name = models.CharField(max_length=32)

def __str__(self):
    return self.name

class Score(models.Model):
score = models.DecimalField(max_digits=5, decimal_places=2)
student = models.ForeignKey(Student, on_delete=models.CASCADE)
course = models.OneToOneField(Course, on_delete=models.CASCADE)

def __str__(self):
    return self.score

</pre>

serializers.py

<pre style="box-sizing: border-box; overflow: auto; font: 12px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; display: block; padding: 16px; margin: 0px 0px 16px; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: normal; background-color: rgb(245, 245, 245); border: 1px solid rgb(187, 187, 187); border-radius: 3px;">#!/usr/bin/env python

-- coding: utf-8 --

@Author: _Tao

@Time: 19-3-26 23:31

from rest_framework import serializers

from demo.models import Classes, Student, Course, Score

class ClassesSerializer(serializers.ModelSerializer):
class Meta:
model = Classes
fields = ('id', 'name')

class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = ('id', 'name', 'sex', 'classes')

class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = ('id', 'name')

class ScoreSerializer(serializers.ModelSerializer):
student = StudentSerializer(many=False, read_only=True)
course = CourseSerializer(many=False, read_only=True)

class Meta:
    model = Score
    fields = ('id', 'score', 'student', 'course')

</pre>

views.py

views_classes.py

<pre style="box-sizing: border-box; overflow: auto; font: 12px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; display: block; padding: 16px; margin: 0px 0px 16px; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: normal; background-color: rgb(245, 245, 245); border: 1px solid rgb(187, 187, 187); border-radius: 3px;">#!/usr/bin/env python

-- coding: utf-8 --

@Author: _Tao

@Time: 19-3-26 23:57

from rest_framework import mixins
from rest_framework import generics

from demo.models import Classes
from demo.serializers import ClassesSerializer

class ClassesList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Classes.objects.all()
serializer_class = ClassesSerializer

def get(self, request, *args, **kwargs):
    return self.list(request, *args, **kwargs)

def post(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs)

class ClassesDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Classes.objects.all()
serializer_class = ClassesSerializer

def get(self, request, *args, **kwargs):
    return self.retrieve(request, *args, **kwargs)

def put(self, request, *args, **kwargs):
    return self.update(request, *args, **kwargs)

def delete(self, request, *args, **kwargs):
    return self.destroy(request, *args, **kwargs)

</pre>

views_course.py

<pre style="box-sizing: border-box; overflow: auto; font: 12px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; display: block; padding: 16px; margin: 0px 0px 16px; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: normal; background-color: rgb(245, 245, 245); border: 1px solid rgb(187, 187, 187); border-radius: 3px;">from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.request import Request
from demo.models import Course
from demo.serializers import CourseSerializer

@api_view(['GET', 'POST'])
def course_list(request: Request):
if request.method == 'GET':
course = Course.objects.all()
serializer = CourseSerializer(course, many=True)
return Response(serializer.data)

elif request.method == 'POST':
    serializer = CourseSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

@api_view(['GET', 'PUT', 'DELETE'])
def course_detail(request: Request, pk):
try:
course = Course.objects.get(pk=pk)
except Course.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)

if request.method == 'GET':
    serializer = CourseSerializer(course)
    return Response(serializer.data)

elif request.method == 'PUT':
    serializer = CourseSerializer(course, data=request.data)
    if serializer.is_valid():
        serializer.save()

        return Response(serializer.data)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

elif request.method == 'DELETE':
    course.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

</pre>

views_score.py

<pre style="box-sizing: border-box; overflow: auto; font: 12px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; display: block; padding: 16px; margin: 0px 0px 16px; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: normal; background-color: rgb(245, 245, 245); border: 1px solid rgb(187, 187, 187); border-radius: 3px;">#!/usr/bin/env python

-- coding: utf-8 --

@Author: _Tao

@Time: 19-3-27 00:02

from rest_framework import generics

from demo.models import Score
from demo.serializers import ScoreSerializer

class ScoreList(generics.ListCreateAPIView):
queryset = Score.objects.all()
serializer_class = ScoreSerializer

class ScoreDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Score.objects.all()
serializer_class = ScoreSerializer
</pre>

views_student.py

<pre style="box-sizing: border-box; overflow: auto; font: 12px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; display: block; padding: 16px; margin: 0px 0px 16px; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: normal; background-color: rgb(245, 245, 245); border: 1px solid rgb(187, 187, 187); border-radius: 3px;">#!/usr/bin/env python

-- coding: utf-8 --

@Author: _Tao

@Time: 19-3-26 23:46

from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from demo.models import Student
from demo.serializers import StudentSerializer

class StudentList(APIView):

def get(self, request, format=None):
    stu = Student.objects.all()
    serializer = StudentSerializer(stu, many=True)

    return Response(serializer.data)

def post(self, request, format=None):
    serializer = StudentSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class StudentDetail(APIView):

def get_object(self, pk):
    try:
        return Student.objects.get(pk)

    except Student.DoesNotExist:
        raise Http404

def get(self, request, pk, format=None):
    stu = self.get_object(pk)
    serializer = StudentSerializer(stu)
    return Response(serializer.data)

def put(self, request, pk, format=None):
    stu = self.get_object(pk)
    serializer = StudentSerializer(stu, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

def delete(self, request, pk, format=None):

    stu = self.get_object(pk)
    stu.delete()

    return Response(status=status.HTTP_204_NO_CONTENT)

</pre>

urls.py

<pre style="box-sizing: border-box; overflow: auto; font: 12px/1.45 Consolas, "Liberation Mono", Menlo, Courier, monospace; display: block; padding: 16px; margin: 0px 0px 16px; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: normal; background-color: rgb(245, 245, 245); border: 1px solid rgb(187, 187, 187); border-radius: 3px;">#!/usr/bin/env python

-- coding: utf-8 --

@Author: _Tao

@Time: 19-3-27 00:03

from django.urls import path, re_path

from demo import views_classes, views_course, views_score, views_student

urlpatterns = [
path('cls/', views_classes.ClassesList.as_view()),
re_path('cls/(?P<pk>[0-9]+)/', views_classes.ClassesDetail.as_view()),
]

urlpatterns += [
path('stu/', views_student.StudentList.as_view()),
re_path('stu/(?P<pk>[0-9]+)/', views_student.StudentDetail.as_view())
]

urlpatterns += [
path('cou/', views_course.course_list),
re_path('cou/(?P<pk>[0-9]+)/', views_course.course_detail),
]

urlpatterns += [
path('sco/', views_score.ScoreList.as_view()),
re_path('sco/(?P<pk>[0-9]+)', views_score.ScoreDetail.as_view())
]</pre>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容