drf序列化器与反序列化
什么是序列化与反序列化
"""
序列化:对象转换为字符串用于传输
反序列化:字符串转换为对象用于使用
"""
drf序列化与反序列化
"""
序列化:Model类对象转换为字符串用于传输
反序列化:字符串转换为Model类对象用于使用
"""
Model类
创建数据库:终端
>: mysql -uroot -p密码
>: create database 数据库名 charset=utf8
配置数据库:settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名',
'USER': 'root',
'PASSWORD': '密码'
}
}
修改操作数据库的模块:项目init文件
import pymysql
pymysql.install_as_MySQLdb()
创建model类:models.py
from django.db import models
class User(models.Model):
CHOICE_SEX = (
(0, '男'),
(1, '女')
)
name = models.CharField(max_length=32, verbose_name='姓名')
password = models.CharField(max_length=64, verbose_name='密码')
sex = models.SmallIntegerField(choices=CHOICE_SEX, default=0)
create_time = models.DateTimeField(auto_now_add=True, blank=True)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
<span class="hljs-comment"># 自定义创建的表名</span>
db_table = <span class="hljs-string">'o_user'</span>
<span class="hljs-comment"># admin界面中显示的表面与表名复数形式</span>
verbose_name = <span class="hljs-string">'用户'</span>
verbose_name_plural = verbose_name
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__str__</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">return</span> self.name</code></pre>
注册model类:admin.py
from django.contrib import admin
from api.models import User
admin.site.register(User)
数据库迁移:在项目目录下的终端
>: python3 manage.py makemigrations
>: python3 manage.py migrate
注册超级用户:在项目目录下的终端
>: python3 manage.py createsuperuser
登陆admin页面添加数据:浏览器
http://localhost:8000/admin/
路由分发
项目urls.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls'))
]
api应用urls.py
from django.conf.urls import url
urlpatterns = [
]
获取多资源 接口
序列化类:serializers.py
from rest_framework import serializers
# 为每一个Model类至少配一个Serializer类
class UserSerializer(serializers.Serializer):
# 序列化一个Model类对象,其实就是序列化该类的每一个属性
name = serializers.CharField()
password = serializers.CharField()
sex = serializers.IntegerField()
create_time = serializers.DateTimeField()
视图类:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer
# 对应路由:/users/
# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个
class UsersAPIView(APIView):
def get(self, request, *args, **kwargs):
user_list = User.objects.all()
<span class="hljs-comment"># instance存放的是queryset对象,many需要设置为True</span>
user_data = UserSerializer(instance=user_list, many=<span class="hljs-keyword">True</span>).data
<span class="hljs-keyword">return</span> Response(
{
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>,
<span class="hljs-string">'results'</span>: user_data
}
)</code></pre>
序列化字段操作(自定义字段)
序列化类修订:serializers.py
from rest_framework import serializers
# 为每一个Model类至少配一个Serializer类
class UserSerializer(serializers.Serializer):
# 序列化一个Model类对象,其实就是序列化该类的每一个属性
# 注意1:Model类与Serializer类是通过属性名建立关联的 - 属性名必须依照
name = serializers.CharField()
password = serializers.CharField()
# sex = serializers.IntegerField()
# 注意2:不需要通过给前台的数据,不需要提供该属性的序列化
# create_time = serializers.DateTimeField()
<span class="hljs-comment"># 注意3:serializers.SerializerMethodField()可以产生自定义序列化属性(不需要和Model类属性同步),</span>
<span class="hljs-comment"># 但要为其绑定一个提供值的函数,函数名为 get_属性(self, obj) (obj为参与序列化的Model类对象)</span>
gender = serializers.SerializerMethodField()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_gender</span><span class="hljs-params">(self, obj)</span>:</span>
<span class="hljs-comment"># 该函数的返回值就作为对应自定义数据序列化后的值</span>
<span class="hljs-keyword">return</span> obj.get_sex_display()</code></pre>
新增单资源 接口
序列化类(反序列化类):serializers.py
from rest_framework import serializers
from .models import User
class UserDeserializer(serializers.Serializer):
name = serializers.CharField(label='姓名', max_length=32, min_length=3, error_messages={
'max_length': '姓名太长',
'min_length': '姓名太短'
})
password = serializers.CharField(label='密码', max_length=64, min_length=3, error_messages={
'max_length': '密码太长',
'min_length': '密码太短'
})
sex = serializers.IntegerField()
# required=False该字段前台可以不用传(不参与校验)
create_time = serializers.DateTimeField(required=False)
<span class="hljs-comment"># 完成ORM的操作</span>
<span class="hljs-comment"># def save(self): # 不能直接重写save,因为系统的save可以完成新增或修改</span>
<span class="hljs-comment"># # print(self.validated_data)</span>
<span class="hljs-comment"># User.objects.create(**self.validated_data)</span>
<span class="hljs-comment"># 为post接口提供新增Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create</span><span class="hljs-params">(self, validated_data)</span>:</span>
<span class="hljs-comment"># 返回值:Model类要新增的对象</span>
<span class="hljs-keyword">return</span> User.objects.create(**validated_data)</code></pre>
视图类:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer
# 对应路由:/users/
# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个
class UsersAPIView(APIView):
# 新增一个资源
def post(self, request, *args, **kwargs):
user_deser = UserDeserializer(data=request.data)
# raise_exception值为True,当校验失败,直接返回校验失败的错误信息
# result = user_deser.is_valid(raise_exception=True)
result = user_deser.is_valid()
if result:
new_user_obj = user_deser.save()
return Response({
'status': 0,
'msg': 'success',
'result': UserSerializer(new_user_obj).data
})
else:
return Response({
'status': 1,
'msg': 'failed',
'results': user_deser.errors
})
更新单资源 接口
序列化类(反序列化类):serializers.py
from rest_framework import serializers
from .models import User
class UserDeserializer(serializers.Serializer):
name = serializers.CharField(label='姓名', max_length=32, min_length=3, error_messages={
'max_length': '姓名太长',
'min_length': '姓名太短'
})
password = serializers.CharField(label='密码', max_length=64, min_length=3, error_messages={
'max_length': '密码太长',
'min_length': '密码太短'
})
sex = serializers.IntegerField()
# required=False该字段前台可以不用传(不参与校验)
create_time = serializers.DateTimeField(required=False)
<span class="hljs-comment"># 完成ORM的操作</span>
<span class="hljs-comment"># def save(self): # 不能直接重写save,因为系统的save可以完成新增或修改</span>
<span class="hljs-comment"># # print(self.validated_data)</span>
<span class="hljs-comment"># User.objects.create(**self.validated_data)</span>
<span class="hljs-comment"># 为post接口提供新增Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create</span><span class="hljs-params">(self, validated_data)</span>:</span>
<span class="hljs-comment"># 返回值:Model类要新增的对象</span>
<span class="hljs-keyword">return</span> User.objects.create(**validated_data)
<span class="hljs-comment"># 为put接口提供更新Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">update</span><span class="hljs-params">(self, instance, validated_data)</span>:</span>
<span class="hljs-comment"># 操作model对象</span>
<span class="hljs-comment"># instance.name = validated_data.get('name')</span>
<span class="hljs-comment"># instance.password = validated_data.get('password')</span>
<span class="hljs-comment"># instance.sex = validated_data.get('sex')</span>
<span class="hljs-comment"># instance.save()</span>
<span class="hljs-comment"># 操作queryset对象</span>
instance.update(**validated_data)
<span class="hljs-keyword">return</span> instance</code></pre>
视图类:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer
# 对应路由:/users/
# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个
class UsersAPIView(APIView):
# 更新一个资源
def put(self, request, *args, **kwargs):
# 要更新的资源的主键
pk = kwargs.get('pk')
<span class="hljs-comment"># 操作更新时可以选择操作 queryset对象 或 model对象</span>
<span class="hljs-comment"># 操作model对象</span>
<span class="hljs-comment"># old_user_obj = User.objects.get(pk=pk)</span>
<span class="hljs-comment"># user_deser = UserDeserializer(instance=old_user_obj, data=request.data)</span>
<span class="hljs-comment"># 操作queryset对象</span>
old_user_query = User.objects.filter(pk=pk)
user_deser = UserDeserializer(instance=old_user_query, data=request.data)
<span class="hljs-comment"># raise_exception值为True,当校验失败,直接返回校验失败的错误信息</span>
<span class="hljs-comment"># result = user_deser.is_valid(raise_exception=True)</span>
result = user_deser.is_valid()
<span class="hljs-keyword">if</span> result:
<span class="hljs-comment"># new_user_obj = user_deser.save() # 操作model对象</span>
new_user_query = user_deser.save() <span class="hljs-comment"># 操作queryset对象</span>
new_user_obj = new_user_query.first()
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'success'</span>,
<span class="hljs-string">'result'</span>: UserSerializer(new_user_obj).data
})
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'failed'</span>,
<span class="hljs-string">'results'</span>: user_deser.errors
})</code></pre>
删除单资源 接口
重构Model新增字段:models.py
class User(models.Model):
CHOICE_SEX = (
(0, '男'),
(1, '女')
)
name = models.CharField(max_length=32, verbose_name='姓名')
password = models.CharField(max_length=64, verbose_name='密码')
sex = models.SmallIntegerField(choices=CHOICE_SEX, default=0)
create_time = models.DateTimeField(auto_now_add=True, blank=True)
# 新增:数据删除不是从数据库删除记录,而是修改记录状态,标示为已删除即可
is_delete = models.BooleanField(default=False)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
<span class="hljs-comment"># 自定义创建的表名</span>
db_table = <span class="hljs-string">'o_user'</span>
<span class="hljs-comment"># admin界面中显示的表面与表名复数形式</span>
verbose_name = <span class="hljs-string">'用户'</span>
verbose_name_plural = verbose_name
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__str__</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">return</span> self.name</code></pre>
数据库迁移:在项目目录下的终端
>: python3 manage.py makemigrations
>: python3 manage.py migrate
视图类接口:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer
# 对应路由:/users/
# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个
class UsersAPIView(APIView):
# 删除一个资源
def delete(self, request, *args, **kwargs):
pk = kwargs.get('pk')
try:
delete_user_obj = User.objects.get(pk=pk, is_delete=False)
# 完成删除信息的更新
delete_user_obj.is_delete = True
delete_user_obj.save()
return Response()
except:
return Response({
'status': 1,
'msg': '数据删除失败'
})
获取单资源 接口
序列化类:serializers.py
from rest_framework import serializers
# 为每一个Model类至少配一个Serializer类
class UserSerializer(serializers.Serializer):
# 序列化一个Model类对象,其实就是序列化该类的每一个属性
name = serializers.CharField()
password = serializers.CharField()
sex = serializers.IntegerField()
create_time = serializers.DateTimeField()
视图类:views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer
# 对应路由:/users/
# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个
class UsersAPIView(APIView):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk', None)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> pk:
user_query = User.objects.filter(is_delete=<span class="hljs-keyword">False</span>).all()
<span class="hljs-keyword">else</span>:
user_query = User.objects.filter(is_delete=<span class="hljs-keyword">False</span>, pk=pk)
<span class="hljs-comment"># 如果只操作一个对象,many参数需要为False(默认值)</span>
<span class="hljs-comment"># user_obj = User.objects.filter(is_delete=False, pk=pk).first()</span>
<span class="hljs-comment"># user_data = UserSerializer(instance=user_obj, many=False).data</span>
user_data = UserSerializer(instance=user_query, many=<span class="hljs-keyword">True</span>).data
<span class="hljs-keyword">return</span> Response(
{
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>,
<span class="hljs-string">'results'</span>: user_data
}
)</code></pre>
序列化基础:重点内容
模型类:models.py
from django.db import models
# Create your models here.
class User(models.Model):
CHOICE_SEX = (
(0, '男'),
(1, '女')
)
name = models.CharField(max_length=32, verbose_name='姓名')
password = models.CharField(max_length=64, verbose_name='密码')
sex = models.SmallIntegerField(choices=CHOICE_SEX, default=0)
create_time = models.DateTimeField(auto_now_add=True, blank=True)
# 数据删除不是从数据库删除记录,而是修改记录状态,标示为已删除即可
is_delete = models.BooleanField(default=False)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
<span class="hljs-comment"># 自定义创建的表名</span>
db_table = <span class="hljs-string">'o_user'</span>
<span class="hljs-comment"># admin界面中显示的表面与表名复数形式</span>
verbose_name = <span class="hljs-string">'用户'</span>
verbose_name_plural = verbose_name
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__str__</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">return</span> self.name</code></pre>
序列化类:
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.Serializer):
# 序列化和反序列化都可以使用
name = serializers.CharField(label='姓名', max_length=32, min_length=3, error_messages={
'max_length': '姓名太长',
'min_length': '姓名太短'
})
password = serializers.CharField(label='密码', max_length=64, min_length=3, error_messages={
'max_length': '密码太长',
'min_length': '密码太短'
})
# 只有反序列化使用 - 用 write_only=True 标示只参与反序列化
sex = serializers.IntegerField(write_only=True)
# 只有序列化使用 - 自定义字段 - 用 read_only=True 标示只参与序列化
gender = serializers.SerializerMethodField(read_only=True)
def get_gender(self, obj):
return obj.get_sex_display()
# 序列化与反序列化都不使用 - 1)注释 | 2)required=False, write_only=True
create_time = serializers.DateTimeField(required=False, write_only=True)
<span class="hljs-comment"># 为全局校验钩子新增校验字段</span>
re_password = serializers.CharField(label=<span class="hljs-string">'确认密码'</span>, max_length=<span class="hljs-number">64</span>, min_length=<span class="hljs-number">3</span>, write_only=<span class="hljs-keyword">True</span>, error_messages={
<span class="hljs-string">'max_length'</span>: <span class="hljs-string">'确认密码太长'</span>,
<span class="hljs-string">'min_length'</span>: <span class="hljs-string">'确认密码太短'</span>
})
<span class="hljs-comment"># 反序列化两大方法重写 - 新增create | 更新update</span>
<span class="hljs-comment"># 为post接口提供新增Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">create</span><span class="hljs-params">(self, validated_data)</span>:</span>
<span class="hljs-comment"># 返回值:Model类要新增的对象</span>
<span class="hljs-keyword">return</span> User.objects.create(**validated_data)
<span class="hljs-comment"># 为put接口提供更新Model类对象的功能</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">update</span><span class="hljs-params">(self, instance, validated_data)</span>:</span>
instance.update(**validated_data)
<span class="hljs-comment"># 返回更新后的instance</span>
<span class="hljs-keyword">return</span> instance
<span class="hljs-comment"># 局部钩子</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">validate_sex</span><span class="hljs-params">(self, value)</span>:</span>
<span class="hljs-keyword">if</span> value <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> (<span class="hljs-number">0</span>, <span class="hljs-number">1</span>):
<span class="hljs-keyword">raise</span> serializers.ValidationError(<span class="hljs-string">'未知性别'</span>)
<span class="hljs-keyword">return</span> value
<span class="hljs-comment"># 全局钩子</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">validate</span><span class="hljs-params">(self, attrs)</span>:</span>
re_password = attrs.pop(<span class="hljs-string">'re_password'</span>)
password = attrs.get(<span class="hljs-string">'password'</span>)
<span class="hljs-keyword">if</span> re_password != password:
<span class="hljs-keyword">raise</span> serializers.ValidationError(<span class="hljs-string">'二次密码不一致'</span>)
<span class="hljs-keyword">return</span> attrs</code></pre>
视图类:
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer
# 对应路由:/users/ | /users/pk/
# 功能:get获取所有 | post新增一个 | put修改一个 | delete删除一个 | get获取一个
class UsersAPIView(APIView):
# 获取所有资源 | 单个资源
def get(self, request, *args, **kwargs):
# 单个资源的主键
pk = kwargs.get('pk', None)
if not pk:
user_query = User.objects.filter(is_delete=False).all()
else:
user_query = User.objects.filter(is_delete=False, pk=pk)
user_data = UserSerializer(instance=user_query, many=<span class="hljs-keyword">True</span>).data
<span class="hljs-keyword">return</span> Response(
{
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>,
<span class="hljs-string">'results'</span>: user_data
}
)
<span class="hljs-comment"># 新增一个资源</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">post</span><span class="hljs-params">(self, request, *args, **kwargs)</span>:</span>
user_deser = UserSerializer(data=request.data)
<span class="hljs-comment"># raise_exception值为True,当校验失败,直接返回校验失败的错误信息</span>
<span class="hljs-comment"># result = user_deser.is_valid(raise_exception=True)</span>
result = user_deser.is_valid()
<span class="hljs-keyword">if</span> result:
new_user_obj = user_deser.save()
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'success'</span>,
<span class="hljs-string">'result'</span>: UserSerializer(new_user_obj).data
})
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'failed'</span>,
<span class="hljs-string">'results'</span>: user_deser.errors
})
<span class="hljs-comment"># 更新一个资源</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">put</span><span class="hljs-params">(self, request, *args, **kwargs)</span>:</span>
pk = kwargs.get(<span class="hljs-string">'pk'</span>)
old_user_query = User.objects.filter(pk=pk, is_delete=<span class="hljs-keyword">False</span>)
<span class="hljs-comment"># 没有数据</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> old_user_query:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'update failed'</span>,
})
user_deser = UserSerializer(instance=old_user_query, data=request.data)
result = user_deser.is_valid()
<span class="hljs-keyword">if</span> result:
new_user_query = user_deser.save()
new_user_obj = new_user_query.first()
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'success'</span>,
<span class="hljs-string">'result'</span>: UserSerializer(new_user_obj).data
})
<span class="hljs-keyword">else</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'failed'</span>,
<span class="hljs-string">'results'</span>: user_deser.errors
})
<span class="hljs-comment"># 删除一个资源</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">delete</span><span class="hljs-params">(self, request, *args, **kwargs)</span>:</span>
pk = kwargs.get(<span class="hljs-string">'pk'</span>)
<span class="hljs-keyword">try</span>:
delete_user_obj = User.objects.get(pk=pk, is_delete=<span class="hljs-keyword">False</span>)
<span class="hljs-comment"># 完成删除信息的更新</span>
delete_user_obj.is_delete = <span class="hljs-keyword">True</span>
delete_user_obj.save()
<span class="hljs-keyword">return</span> Response()
<span class="hljs-keyword">except</span>:
<span class="hljs-keyword">return</span> Response({
<span class="hljs-string">'status'</span>: <span class="hljs-number">1</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'数据删除失败'</span>
})</code></pre>
drf序列化器与反序列化的更多相关文章
- DRF框架之Serializer序列化器的反序列化操作
昨天,我们完成了Serializer序列化器的反序列化操作,那么今天我们就来学习Serializer序列化器的最后一点知识,反序列化操作. 首先,我们定要明确什么是反序列化操作? 反序列化操作:JOS ...
- drf序列化器的实例
应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views imp ...
- DRF序列化器的使用
序列化器的使用 序列化器的使用分两个阶段: 在客户端请求时,使用序列化器可以完成对数据的反序列化. 在服务器响应时,使用序列化器可以完成对数据的序列化. 序列化的基本使用 使用的还是上一篇博文中使用的 ...
- DRF 序列化器-Serializer (2)
作用 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器 ...
- DRF序列化器
序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典 ...
- drf序列化器serializers.SerializerMethodField()的用法
问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...
- 对drf序列化器的理解
序列化: 将对象的状态信息转换为可以存储或传输的形式的过程.(百度定义) 对应到drf中,序列化即把模型对象转换为字典形式, 再返回给前端,主要用于输出 反序列化: 把其他格式转化为程序中的格式. 对 ...
- 关于定义序列化器时,read_only和write_only有什么作用
关于序列化和反序列化 在谈论前,先说一下序列化和反序列化,这两个概念最初是在学习json的时候提出来的,回头来看,其实可以用最初的理解就可以了 序列化就是将对象转化方便传输和存储字节序列,例如js ...
- 一: DRF web应用框架基础,及序列化器的使用
---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...
随机推荐
- 二进制安装mysql-5.7.26
一.上传二进制 mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz包 #/data 是数据盘 自己根据情况定 [root@VM_0_10_centos data]# ...
- Three.js构造一个简单的房间
主要研究three.js在3D场景中基本使用:画一个简单的房子.房子上画门和玻璃.房间内放一个床.定义鼠标事件可以移动场景.动画的使用等. 1.Three.js画的一个简单的房子,模拟地板以及四堵墙 ...
- JSON学习(三)
案例: * 校验注册用户名是否存在 在注册页面,填写完用户名且该栏失去焦点时,前端会进行ajax传输该内容与后台数据库进行比对, 若数据库中没有该用户名,则用户栏后显示“用户名可用”,反之,则显示&q ...
- C/C++語言 - 日常算法 - 蛇形填數
C/C++語言 - 日常算法 - 蛇形填數 日期 : 2019-06-11 問題描述: 在n×n方阵里填入1,2,…,n×n,要求填成蛇形. 例如,n=4时方阵为: 10 11 12 1 9 ...
- vue路由懒加载及组件懒加载
一.为什么要使用路由懒加载 为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题. 二.定义 懒加载简单来说就是延迟加载或按需加载,即在需要的时候的时候进行加载. 三.使用 常用的懒加载方式 ...
- 函数this指向哪个对象?
函数的this指向是根据函数调用时所处的执行环境来确定的. this指向对象的情况有四种: 1.使用new关键字时:this会绑定构造函数所创建的对象. function Foo(){ this.a ...
- 三伏天里小试牛刀andriod 开发 #华为云·寻找黑马程序员#【华为云技术分享】
2019年07月,北京,三伏天,好热啊.越热自己还越懒得动换(肉身给的信号),但是做为产品经理/交互设计师的,总想着思考些什么(灵魂上给的信号),或者是学习些什么,更有利于将来的职业发展吧,哈哈哈.工 ...
- Spring Boot整合Mybatis完成级联一对多CRUD操作
在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...
- zcmu 1540第k大数
1540: 第k大数Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Web Board]Description有两个序列a,b,它们的 ...
- Spring中的ApplicationListener的使用详解案例
本文链接:https://blog.csdn.net/u010963948/article/details/83507185 1.ApplicationContext Spring的核心,Contex ...