Django REST framework基础:序列化
表结构:
class Article(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64)
create_time = models.DateField(auto_now=True)
type = models.SmallIntegerField(
choices=((1, '原创'), (2, '转载')),
default=1
)
source = models.ForeignKey(to='Source', on_delete=models.CASCADE)
tag = models.ManyToManyField(to='Tag') class Source(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, unique=True, error_messages={"unique": '校区名称不能重复'}) class Tag(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) class Comment(models.Model):
content = models.CharField(max_length=255)
article = models.ForeignKey(to='Article', on_delete=models.CASCADE)
单表的GET和POST:
路由:
url(r'source/', views.SourceView.as_view()),
序列化类:
class SourceSerializer(serializers.ModelSerializer):
def validate_name(self, value):
if '草' in value:
raise ValidationError('不符合社会主义核心价值观')
return value
class Meta:
model = models.Source
fields = "__all__"
视图:
class SourceView(APIView):
def get(self, request, *args, **kwargs):
res = {"code": 0}
all_source = models.Source.objects.all()
ser_obj = SourceSerializer(all_source, many=True)
res["data"] = ser_obj.data
return Response(res)
def post(self, request, *args, **kwargs):
res = {"code": 0}
ser_obj = SourceSerializer(data=request.data)
if ser_obj.is_valid():
# 数据没问题
ser_obj.save()
return Response(res)
else:
res["code"] = 1
res["error"] = ser_obj.errors
return Response(res)
外键的GET和POST:
路由:
url(r'comment/', views.Comment.as_view()),
序列化:
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = models.Comment
fields = "__all__"
extra_kwargs = {
"content": {"error_messages": {"required": "评论内容不能为空"}},
"article": {"error_messages": {"required": "文章不能为空"}}
}
视图:
class Comment(APIView):
def get(self, request, *args, **kwargs):
res = {"code": 0}
all_data = models.Comment.objects.all()
ser_obj = CommentSerializer(all_data, many=True)
res["data"] = ser_obj.data
return Response(res) def post(self, request, *args, **kwargs):
res = {"code": 0}
ser_obj = CommentSerializer(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
else:
res["code"] = 1
res["error"] = ser_obj.errors
return Response(res)
多对多的GET和POST:
路由:
url(r'article/', views.ArticleList.as_view()),
序列化:
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = models.Tag
fields = "__all__"
class ArticleSerializer(serializers.ModelSerializer):
type = serializers.CharField(source="get_type_display")
tag = TagSerializer(many=True)
class Meta:
model = models.Article
fields = ["id", "title", "type", "source", "tag"]
class ArticleWriteSerializer(serializers.ModelSerializer):
class Meta:
model = models.Article
fields = "__all__"
extra_kwargs = {
"tag": {
"error_messages": {
"does_not_exist": '"{pk_value}"对应的tag对象不存在。'
}
}
}
视图:
class ArticleList(APIView):
def get(self, request, *args, **kwargs):
res = {"code": 0}
article_list = models.Article.objects.all()
ser_obj = ArticleSerializer(article_list, many=True)
res["data"] = ser_obj.data
return Response(res) def post(self, request, *args, **kwargs):
res = {"code": 0}
ser_obj = ArticleWriteSerializer(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
else:
res["code"] = 1
res["error"] = ser_obj.errors
return Response(res)
超链接的序列化:
路由:
urlpatterns = [
url(r'articlelinked/', views.ArticleLinked.as_view()),,
url(r'source/(?P<pk>\d+)', views.SourceDetailView.as_view(), name='source-detail'),
]
序列化:
class ArticleHyperlinkedSerializer(serializers.HyperlinkedModelSerializer):
source = serializers.HyperlinkedIdentityField(view_name='source-detail', lookup_field='source_id', lookup_url_kwarg='pk') class Meta:
model = models.Article
fields = ["id", "type", "title", "source"]
depth = 1
视图:
class ArticleLinked(APIView):
def get(self, request, *args, **kwargs):
res = {"code": 0}
article_list = models.Article.objects.all()
ser_obj = ArticleHyperlinkedSerializer(article_list, many=True, context={'request': request})
res["data"] = ser_obj.data
return Response(res)
Django REST framework基础:序列化的更多相关文章
- Django Rest framework 之 序列化
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- Django rest framework 基础
01: Django rest framework 基础 1.1 什么是RESTful 1. REST与技术无关,代表的是一种软件架构风格(REST是Representational Stat ...
- Django REST framework基础:视图和路由
DRF中的Request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Dj ...
- Django Rest framework基础使用之 serializer
rest-framework文档地址:http://www.django-rest-framework.org/ Django Rest framework是一个非常强大且灵活的工具包,用于构建web ...
- Django REST Framework的序列化器是什么?
# 转载请留言联系 用Django开发RESTful风格的API存在着很多重复的步骤.详细可见:https://www.cnblogs.com/chichung/p/9933861.html 过程往往 ...
- Django Rest framework基础使用之View:APIView, mixins, generic, viewsets
先看一张图,对DRF的各个APIView,Mixin,Viewset等有个基本印象: 具体使用方法: 1.APIView: DRF 的API视图 有两种实现方式: 一种是基于函数的:@api_view ...
- Django Rest Framework(2)-----序列化详解(serializers)
REST framework中的序列化类与Django的Form和ModelForm类非常相似.我们提供了一个Serializer类,它提供了一种强大的通用方法来控制响应的输出,以及一个ModelSe ...
- Django restful Framework 之序列化与反序列化
1. 首先在已建好的工程目录下新建app命名为snippets,并将snippets app以及rest_framework app加到工程目录的 INSTALLED_APPS 中去,具体如下: IN ...
- Django rest framework之序列化小结
最近在DRF的序列化上踩过了不少坑,特此结合官方文档记录下,方便日后查阅. [01]前言 serializers是什么?官网是这样的”Serializers allow complex d ...
随机推荐
- 华为oj之字符串最后一个单词的长度
题目: 字符串最后一个单词的长度 热度指数:9697 时间限制:1秒 空间限制:32768K 本题知识点: 字符串 题目描述 计算字符串最后一个单词的长度,单词以空格隔开. 输入描述: 一行字符串,非 ...
- JS 中 原生方法 (四) --- Object
Javascript 中 str. arr.date.obj 等常见的原生方法总结 本文也说主要阐释了 Javascript 中的基础类型和 引用类型的自带方法,那么熟悉的同学又可以绕道了 总是绕道, ...
- 【Python3爬虫】下载酷狗音乐上的歌曲
经过测试,可以下载要付费下载的歌曲(n_n) 准备工作:Python3.5+Pycharm 使用到的库:requests,re,json,time,fakeuseragent 步骤: 打开酷狗音乐的官 ...
- 前端笔记之JavaScript(十)深入JavaScript节点&DOM&事件
一.DOM JavaScript语言核心.变量的定义.变量的类型.运算符.表达式.函数.if语句.for循环.算法等等.这些东西都属于语言核心,下次继续学习语言核心就是面向对象了.JavaScript ...
- Python:zip 函数的用法
zip() 接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个 tuple,然后返回由这些 tuple 组成的 list. 若传入参数的长度不等,则返回 list 的长度和参数中长度最短的 ...
- centos7修改网卡名字为传统名字
前言:在centos6及其之前的系统中,我们已经习惯了网卡为eth0,eht1这种网卡命名方式,在centos7上网卡名字为ens33,ens37,ens38等名字,很别扭,想统一下网卡的命名. 1 ...
- 使用yum安装不知道到底安装在什么文件夹
find /* >yum001 #记录之前的文件夹 find /* >yum002 #记录安装完成后的文件夹 diff yum001 yum002 >yum000 ...
- C++STL模板库关联容器之set/multiset
目录 一丶关联容器简介.set/multiset 二丶演示代码. 一丶关联容器简介.set/multiset 我们的序列容器,底层都是线性表构成的. 比如 vector list deque. 关联容 ...
- Docker最全教程——从理论到实战(三)
往期链接: https://www.cnblogs.com/codelove/p/10030439.html https://www.cnblogs.com/codelove/p/10036608.h ...
- 线程的私有领地 ThreadLocal
从名字上看,『ThreadLocal』可能会给你一种本地线程的概念印象,可能会让你联想到它是一个特殊的线程. 但实际上,『ThreadLocal』却营造了一种「线程本地变量」的概念,也就是说,同一个变 ...