REST framework组件-序列化

  model部分:
from django.db import models

class Book(models.Model):
    title=models.CharField(max_length=32)
    price=models.IntegerField()
    pub_date=models.DateField()
    publish=models.ForeignKey("Publish", on_delete=models.CASCADE)
    authors=models.ManyToManyField("Author")
    def __str__(self):
        return self.title

class Publish(models.Model):
    name=models.CharField(max_length=32)
    email=models.EmailField()
    def __str__(self):
        return self.name

class Author(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()
    def __str__(self):
        return self.name
序列化方式一(python自带方法):
class BookView(View):
    def get(self, request):
        book_list = list(Book.objects.all().values())
        return HttpResponse(book_list)
序列化方式二(django方法):
class BookView(View):
    def get(self, request):
        book_list = Book.objects.all()
        from django.forms.models import model_to_dict
        data=[]
        for obj in book_list:
            data.append(model_to_dict(obj))
        return HttpResponse(data)
序列化方式三(django方法)
class BookView(View):
    def get(self, request):
        from django.core import serializers
        book_list = Book.objects.all()
        data=serializers.serialize("json",book_list)
        return HttpResponse(data)
序列化方式四(rest-framework方法)
class BookView(APIView):
    def get(self, request):
        book_list = Book.objects.all()
        bs = BookSerializers(book_list, many=True)   #当传的是一个queryset时要加many=True,如果是一个单个对象则不用加
return Response(bs.data)

class BookSerializers(serializers.Serializer):
title = serializers.CharField(max_length=32)
price = serializers.IntegerField()
# pub_date = serializers.DateField()
publish = serializers.CharField(source='publish.name') #source表示返回json显示的字段
# authors = serializers.CharField(source='authors.all')
authors = serializers.SerializerMethodField() # 多对多

def get_authors(self, obj):
temp = []
for author in obj.authors.all():
temp.append(author.name)
return temp

 我们可以看到当我们拿到book_list后,有很多种方式来进行序列化,这里我们使用的是rest_framwork带的serializers来进行的序列化,在返回时我们也用到了rest_framwork的Response

rest-freamework为我们提供了ModelSerializer类来简化序列化的操作,并且可以将前台传递的json进行反序列化

序列化时外键关系的处理:
方式1:
#访问时默认显示外键id ,创建时传id
class BookModelSerializers(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
 方式2:
#访问时显示外键字段的所有信息,但是只读的,不可编辑,即新建时不能传值
class BookModelSerializers(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
        depth = 1   
方式3:
#访问时显示id/其他,新建时传id值/其他值
class BookModelSerializers(serializers.ModelSerializer):
    publish = serializers.SlugRelatedField(queryset=Publish.objects.all(),slug_field='id')

    class Meta:
        model = Book
        fields = '__all__'
        depth = 1
model列表的get和post请求
class BookView(APIView):
    def get(self, request):
        book_list = Book.objects.all()
        bs = BookModelSerializers(book_list, many=True)
        return Response(bs.data)

    def post(self, request):
        bs = BookModelSerializers(data=request.data)
        if bs.is_valid():
            bs.save()
            return Response(bs.data)
        else:
            return Response(bs.errors)

 

 单个model的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)

 

 

 url部分
urlpatterns = [
    path('books/', views.BookView.as_view()),
    re_path(r'^bookdetail/(?P<pk>\d+)', views.BookDetailViewSet.as_view()),
]

 

posted @ 2018-08-31 01:14  gloomysun  阅读(173)  评论(0编辑  收藏  举报