智慧农业网站建设,网站建设参考文献目录,seo流量软件,熊掌号网站改造绑定织梦网站1. 序列化器
REST framework提供了一个serializer类#xff0c;它可以非常方便的序列化模型实例和查询集为JSON或者其他内容形式。它还提供反序列化#xff0c;允许在验证传入数据后将解析的数据转换回复杂类型。 2. 定义序列化器
在crm应用目录下创建serializers.py文件它可以非常方便的序列化模型实例和查询集为JSON或者其他内容形式。它还提供反序列化允许在验证传入数据后将解析的数据转换回复杂类型。 2. 定义序列化器
在crm应用目录下创建serializers.py文件编写代码如下
from rest_framework import serializersfrom crm.models import Studentclass StudentSerializer(serializers.Serializer):学生序列化器id serializers.IntegerField(label学生id, read_onlyTrue)name serializers.CharField(label姓名)sex serializers.IntegerField(label性别, default1)age serializers.IntegerField(label年龄, requiredFalse, allow_nullTrue)qq serializers.CharField(labelqq号码, requiredFalse, allow_nullTrue)phone serializers.CharField(label手机号码, requiredFalse, allow_nullTrue)channel serializers.CharField(label渠道, read_onlyTrue)c_time serializers.DateTimeField(label创建时间, read_onlyTrue)def create(self, validated_data):创建对象:param validated_data::return:return Student.objects.create(**validated_data)def update(self, instance, validated_data):更新对象:param instance: :param validated_data: :return: for key, value in validated_data.items():setattr(instance, key, value)instance.save()return instance 序列化器类的第一部分定义了要序列化/反序列化的字段。create()和update()方法定义了在调用serializer.save()时如何创建或修改实例。 3. 使用序列化器
序列化
进入Django Shell
python manage.py shell
先导入一些需要用到的对象
from crm.models import Student
from crm.serializers import StudentSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParserobj Student.objects.first()
序列化这个实例
s StudentSerializer(obj)
s.data
# {id: 3, name: 赵六, sex: 1, age: 22, qq: 1111, phone: 18684720553, channel: 抖音, c_time: 2022-01-14T21:45:06.03774508:00}
我们已经将模型实例转换为Python原生数据类型。为了完成序列化过程我们将数据呈现为json。
JSONRenderer().render(s.data)
# b{id:3,name:\xe8\xb5\xb5\xe5\x85\xad,sex:1,age:22,qq:1111,phone:18684720553,channel:\xe6\x8a\x96\xe9\x9f\xb3,c_time:2022-01-14T21:45:06.03774508:00}
我们还可以序列化查询集而不是模型实例。为此我们只需manyTrue向序列化程序参数添加一个标志。
ss StudentSerializer(Student.objects.all(), manyTrue)
ss.data
# [OrderedDict([(id, 3), (name, 赵六), (sex, 1), (age, 22), (qq, 1111), (phone, 18684720553), (channel, 抖音), (c_time, 2022-01-14T21:45:06.03774508:00)]), OrderedDict([(id, 15), (name, 心蓝), (sex, 1), (age, 20), (qq, 111), (phone, 1111123), (channel, 百度), (c_time, 2022-02-08T21:59:54.74309608:00)]), OrderedDict([(id, 21), (name, 西瓜), (sex, 1), (age, 20), (qq, 123456789), (phone, 987654321), (channel, 抖音), (c_time, 2022-02-09T21:15:37.19950908:00)])] 反序列化
反序列化是相似的首先将序列化数据(json)解析为原生python数据类型省略然后将其填充到一个序列器对象中。
里面要注意的是 当执行serializer.save()的时候会看有没有instance这个对象 有的话就是更新没有的话就是创建。
In [1]: from crm.serializers import StudentSerializerIn [2]: from crm.models import *In [3]: data {name: 李晨, sex:1, age:18}In [4]: serializer StudentSerializer(datadata)In [5]: serializer.is_valid()
Out[5]: TrueIn [6]: serializer.validated_data
Out[6]: OrderedDict([(name, 李晨), (sex, 1), (age, 18)])In [7]: stu serializer.save()In [8]: stu
Out[8]: Student: 李晨4. 使用模型序列化器
我们的StudentSerializer类复制了大量Student模型中的的信息。RESTframework提供了一个ModelSerializer,它可以根据模型自动创建Serializer类让我们的代码更简洁。再次打开crm/serializers.py模块并用以下代码替换StudentSerializer类。
class StudentSerializer(serializers.ModelSerializer):class Meta:model Studentfields [id, name, sex, age, phone, qq, c_time]
序列化器的一个很好的属性是您可以通过打印序列化器实例的表示形式来检查它的所有字段。进入Django shell然后尝试如下操作
In [1]: from crm.serializers import StudentSerializer
In [2]: s StudentSerializer()
In [3]: print(s)
StudentSerializer():id IntegerField(labelID, read_onlyTrue)name CharField(help_text姓名, label姓名, max_length20)age IntegerField(allow_nullTrue, help_text年龄, label年龄, max_value32767, min_value-32768, requiredFalse)sex IntegerField(help_text性别, label性别, max_value32767, min_value-32768, requiredFalse)qq CharField(allow_blankTrue, allow_nullTrue, help_textqq号码, labelQq号码, max_length20, requiredFalse, validators[UniqueValidator(querysetStudent.objects.all())])phone CharField(allow_blankTrue, allow_nullTrue, help_text手机号码, label手机号码, max_length20, requiredFalse, validators[UniqueValidator(querysetStudent.objects.all())])c_time DateTimeField(label创建时间, read_onlyTrue)channel PrimaryKeyRelatedField(allow_nullTrue, help_text渠道来源, label渠道, querysetChannel.objects.all(), requiredFalse)
ModelSerializer类并没有做什么特别神奇的事情它们只是创建serializer类的一个快捷方式: 一组自动确定的字段。create()和update()方法的简单默认实现。5. 使用序列化器编写普通的Django视图
让我们看看如何使用我们新的序列化器类来编写一些API视图。目前我们不会使用任何REST框架的其他特性我们只会把视图写成普通的Django视图。 编辑crm/views.py添加如下内容
def student_list(request):学生列表创建学生视图:param request::return:if request.method GET:objs Student.objects.all()serializer StudentSerializer(objs, manyTrue)return JsonResponse(serializer.data, safeFalse)elif request.method POST:data JSONParser().parse(request)serializer StudentSerializer(datadata)if serializer.is_valid():serializer.save()return JsonResponse(serializer.data, status201)else:return JsonResponse(serializer.errors, status400)def student_detail(request, pk):检索更新或者删除一个学生:param request::param pk::return:try:obj Student.objects.get(pkpk)except Student.DoesNotExist:return HttpResponse(status404)if request.method GET:serializer StudentSerializer(obj)return JsonResponse(serializer.data)elif request.method PUT:data JSONParser().parse(request)serializer StudentSerializer(obj, datadata)if serializer.is_valid():serializer.save()return JsonResponse(serializer.data)return JsonResponse(serializer.errors, status400)elif request.method DELETE:obj.delete()return HttpResponse(status204) 路由配置如下
urlpatterns [path(projects/, views.project_list),path(projects/int:pk/, views.project_detail)
]
那么通过/projests/和/projects/id/就可以访问对应的接口了。