rest_framework框架1(rest_framework框架----序列化)
序列化
1、创建一个序列化类
简单使用:
开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。
models.py部分
from django.db import models # Create your models here. # 书表 class Book(models.Model): title = models.CharField(max_length=32, verbose_name="书名") price = models.IntegerField(verbose_name="价格") pub_date = models.DateField(verbose_name="出版时间") # 与出版社表关系为一对多关系 publish = models.ForeignKey("Publish", verbose_name="出版社") # 与作者表为多对多关系 authors = models.ManyToManyField("Author", verbose_name="作者") def __str__(self): return self.title # 出版社表 class Publish(models.Model): name = models.CharField(max_length=32, verbose_name="出版社名称") email = models.EmailField(verbose_name="出版社邮箱") def __str__(self): return self.name # 作者表 class Author(models.Model): name = models.CharField(max_length=32, verbose_name="作者姓名") age = models.IntegerField(verbose_name="作者年龄") def __str__(self): return self.name
urls.py 部分
from django.conf.urls import url from django.contrib import admin from APP01 import views # 关联应用APP01中的views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^publishes/', views.PublishView.as_view()), # 添加路径(使用CBV方式) ]
序列化方法(views.py部分)
方法一(list强转)
from django.test import TestCase from django.shortcuts import render, HttpResponse from django.views import View from .models import * import json # Create your tests here. class PublishView(View): def get(self, request): publish_list = list(Publish.objects.all().values("name", "email")) # list强转 return HttpResponse(json.dumps(publish_list)) def post(self, request): pass
方法二(与方法一类似)
from django.test import TestCase from django.shortcuts import render, HttpResponse from django.views import View from .models import * import json # Create your tests here. # 与方法一类似 class PublishView(View): def get(self, request): publish_list = Publish.objects.all() temp = [] for publish in publish_list: temp.append({ "name": publish.name, "email": publish.email }) return HttpResponse(json.dumps(temp)) def post(self, request): pass
方法三(model_to_dict:帮助序列化的一个方法)
from django.test import TestCase from django.shortcuts import render, HttpResponse from django.forms.models import model_to_dict from django.views import View from .models import * # Create your tests here. # model_to_dict:帮助序列化的一个方法 class PublishView(View): def get(self, request): publish_list = Publish.objects.all() temp = [] for publish in publish_list: temp.append(model_to_dict(publish)) # 帮助序列化方法上比方式二 return HttpResponse(temp) def post(self, request): pass
方法四(django中的serializers)
from django.shortcuts import render, HttpResponse from django.views import View from .models import * from django.core import serializers # Create your tests here. # django中的serializers class PublishView(View): def get(self, request): publish_list = Publish.objects.all() obj = serializers.serialize("json", publish_list) return HttpResponse(obj) def post(self, request): pass # 结果 # [{"model": "APP01.publish", "pk": 1, "fields": {"name": "qqq", "email": "123@qq.com"}}, # {"model": "APP01.publish", "pk": 2, "fields": {"name": "ttt", "email": "223@qq.com"}}]
方法五(使用rest_framework中的serializers进行序列化)
from django.shortcuts import render, HttpResponse from django.views import View from .models import * from rest_framework import serializers # Create your tests here. # 类似from组件需要定义一个类 class PublishSerializers(serializers.Serializer): name = serializers.CharField() email = serializers.CharField() # 使用rest_framework中的serializers进行序列化 class PublishView(View): def get(self, request): publish_list = Publish.objects.all() ret = PublishSerializers(publish_list, many=True) # 如果是QuerySet类型的数据需要加many=True默认为False obj = ret.data return HttpResponse(obj) def post(self, request): pass # 结果 # OrderedDict([('name', 'qqq'), ('email', '123@qq.com')]) # OrderedDict([('name', 'ttt'), ('email', '223@qq.com')])
ModelSerializer
class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields="__all__"
depth=1
提交post请求
def post(self,request,*args,**kwargs):
bs=BookSerializers(data=request.data,many=False)
if bs.is_valid():
# print(bs.validated_data)
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)
重写save中的create方法
class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields="__all__"
# exclude = ['authors',]
# depth=1
def create(self, validated_data):
authors = validated_data.pop('authors')
obj = Book.objects.create(**validated_data)
obj.authors.add(*authors)
return obj
单条数据的get和put请求
class BookDetailViewSet(APIView):
def get(self,request,pk):
book_obj=Book.objects.filter(pk=pk).first()
bs=BookSerializers(book_obj)
return Response(bs.data)
def put(self,request,pk):
book_obj=Book.objects.filter(pk=pk).first()
bs=BookSerializers(book_obj,data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)
超链接API:Hyperlinked
class BookSerializers(serializers.ModelSerializer):
publish= serializers.HyperlinkedIdentityField(
view_name='publish_detail',
lookup_field="publish_id",
lookup_url_kwarg="pk")
class Meta:
model=Book
fields="__all__"
#depth=1
urls部分:
|
1
2
3
4
5
6
|
urlpatterns = [ url(r'^books/$', views.BookViewSet.as_view(),name="book_list"), url(r'^books/(?P<pk>\d+)$', views.BookDetailViewSet.as_view(),name="book_detail"), url(r'^publishers/$', views.PublishViewSet.as_view(),name="publish_list"), url(r'^publishers/(?P<pk>\d+)$', views.PublishDetailViewSet.as_view(),name="publish_detail"),]
|


浙公网安备 33010602011771号