Django rest_freamwork初识

创建一个model

from django.db import models

# Create your models here.

class Book(models.Model):
 	title=models.CharField(max_length=32)
 	price=models.IntegerField()
 	pub_date=models.DateField()
 	publish=models.ForeignKey("Publish")
 	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

1.使用序列化serializers

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers

from rest_framework import serializers

class BookSerializers(serializers.Serializer):
    title=serializers.CharField(max_length=32)
    price=serializers.IntegerField()
    pub_date=serializers.DateField()
    publish=serializers.CharField(source="publish.name")
    #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


class BookViewSet(APIView):

    def get(self,request,*args,**kwargs):
        book_list=Book.objects.all()
        # 序列化方式1:
        # from django.forms.models import model_to_dict
        # import json
        # data=[]
        # for obj in book_list:
        #     data.append(model_to_dict(obj))
        # print(data)
        # return HttpResponse("ok")

        # 序列化方式2:
        # data=serializers.serialize("json",book_list)
        # 	return HttpResponse(data)

        # 序列化方式3:
        bs=BookSerializers(book_list,many=True)
        	return Response(bs.data)

2.使用modelserializers

class BookSerializers(serializers.ModelSerializer):
      class Meta:
          model=Book
          fields="__all__"
          depth=1
      #authors=serializers.SerializerMethodField()
      def get_authors(self,obj):
        temp=[]
        for author in obj.authors.all():
            temp.append(author.name)
        return temp

重写create方法 ,否则自定义方法无法保存
def create(self, validated_data):
        
          authors = validated_data.pop('authors')
          obj = Book.objects.create(**validated_data)
          obj.authors.add(*authors)
          return obj

创建一条新数据

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)

### 单条数据的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.py

urlpatterns

  以上案例的完整view代码

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers

from rest_framework import serializers

class BookSerializers(serializers.ModelSerializer):
 	class Meta:
 		model=Book
 		fields="__all__"
 		#depth=1

class PublshSerializers(serializers.ModelSerializer):
	class Meta:
 		model=Publish
 		fields="__all__"
 		depth=1


class BookViewSet(APIView):

	def get(self,request,*args,**kwargs):
 		book_list=Book.objects.all()
 		bs=BookSerializers(book_list,many=True,context={'request': request})
 		return Response(bs.data)


 	def post(self,request,*args,**kwargs):
 		print(request.data)
 		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)


class BookDetailViewSet(APIView):

	def get(self,request,pk):
 		book_obj=Book.objects.filter(pk=pk).first()
 		bs=BookSerializers(book_obj,context={'request': request})
 		return Response(bs.data)

	def put(self,request,pk):
 		book_obj=Book.objects.filter(pk=pk).first()
 		bs=BookSerializers(book_obj,data=request.data,context={'request': request})
 		if bs.is_valid():
 			bs.save()
 			return Response(bs.data)
 		else:
 			return HttpResponse(bs.errors)


class PublishViewSet(APIView):

	def get(self,request,*args,**kwargs):
 		publish_list=Publish.objects.all()
		 bs=PublshSerializers(publish_list,many=True,context={'request': request})
 		return Response(bs.data)


 	def post(self,request,*args,**kwargs):
		bs=PublshSerializers(data=request.data,many=False)
 		if bs.is_valid():
 			# print(bs.validated_data)
 			bs.save()
 			return Response(bs.data)
 		else:
 			return HttpResponse(bs.errors)


class PublishDetailViewSet(APIView):

	def get(self,request,pk):
		 publish_obj=Publish.objects.filter(pk=pk).first()
 		bs=PublshSerializers(publish_obj,context={'request': request})
 		return Response(bs.data)

	def put(self,request,pk):
 		publish_obj=Publish.objects.filter(pk=pk).first()
 		bs=PublshSerializers(publish_obj,data=request.data,context={'request': request})
 		if bs.is_valid():
 			bs.save()
 			return Response(bs.data)
 		else:
 			return HttpResponse(bs.errors)

Django rest_freamwork初识
http://www.jcwit.com/article/169/
作者
Carlos
发布于
2018年7月5日
许可协议