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()), ]