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 ...
随机推荐
- 【java爬虫】---爬虫+基于接口的网络爬虫
爬虫+基于接口的网络爬虫 上一篇讲了[java爬虫]---爬虫+jsoup轻松爬博客,该方式有个很大的局限性,就是你通过jsoup爬虫只适合爬静态网页,所以只能爬当前页面的所有新闻.如果需要爬一个网站 ...
- JVM垃圾回收
1. 概念理解 1.1. 并行(Parallel)与并发(Concurrent) 并行:指多个垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:指用户线程与垃圾收集线程同时执行 1.2. ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- 在Mac电脑编译c51程序
如果不是Seven问起来,我以为C51这种东西已经属于历史遗迹了.不过简单搜索了一下,发现c51老而弥坚,仍然茁壮的生长着.原因据说,一方面是有很大的用户群和既有的软硬件资源,另外一方面,的确在很多的 ...
- String str=null; 和String str=""的区别
1.最大的区别在于String str=null没有分配内存,String str=""分配了内存 2.String str=null 这个引用指向了一个null ,没有地址没 ...
- 无法使用 xxxx附加到应用程序
以管理员运行cmd,输入netsh winsock reset ,重启电脑,OK. 出现这个错误的原因一般是因为游戏的缘由,本人亲测.
- 大战Java虚拟机【3】—— 类加载机制
前言 当你的代码编译成class文件之后,那么虚拟机如何加载这些文件呢?我们需要知道虚拟机到底做了什么样的事情. 类的生命周期 加载--链接---初始化----使用---卸载 类加载过程 1.加载 读 ...
- Connection open error . Connection Timeout Expired. The timeout period elapsed during the post-login phase.
是这样的,最近我在开发Api(重构),用的数据库是Sqlserver,使用的Orm是 SqlSugar(别问我为什么选这个,boss选的同时我也想支持国人写的东西,且文档也很全). 被催的是,写好了程 ...
- Nginx的负载均衡
什么是负载均衡 负载均衡主要通过专门的硬件设备或者通过软件算法实现.通过硬件设备实现的负载均衡效果好.效率高.性能稳定,但是成本比较高.通过软件实现的负载均衡主要依赖于均衡算法的选择和程序的健壮性.均 ...
- 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...