1. 程式人生 > >1.rest-framework學習

1.rest-framework學習

新建三張表

 1 class Author(models.Model):
 2     name=models.CharField(max_length=200)
 3     def __str__(self):
 4         return self.name
 5 
 6 class Publish(models.Model):
 7     name = models.CharField(max_length=200)
 8     def __str__(self):
 9         return self.name
10 
11 class Book(models.Model):
12 title=models.CharField(max_length=200,verbose_name='題目') 13 author=models.ManyToManyField(Author) 14 publish=models.ForeignKey(Publish,on_delete=models.CASCADE) 15 def __str__(self): 16 return self.title

拿book表來說,序列化

1 class Bookserialize(serializers.ModelSerializer):
2 class Meta: 3 model=Book 4 fields="__all__" 5 def create(self, validated_data): 6 print('va',validated_data) 7 author=validated_data.pop('author') 8 obj=Book.objects.create(**validated_data) 9 obj.author.add(*author)

不重寫create也可以,只是為了學習,還可以序列化超連結

    title=serializers.CharField(max_length=200)
    author=serializers.SerializerMethodField()
    publish=serializers.CharField(source='publish.name')
    publish = serializers.HyperlinkedIdentityField(
        view_name='publish_detial',
        lookup_url_kwarg='id'
    )

    def get_author(self,obj):
        s=[]
        for o in obj.author.all():
            s.append(o.name)
        return s

view檢視,如果用了序列化超連結,記得加上context

 1 class Bookview(APIView):
 2     def get(self,request):
 3         booklist=Book.objects.all()
 4         bs=Bookserialize(booklist,context={'request': request},many=True)
 5         return Response(bs.data)
 6 
 7     def post(self,request):
 8         print(request.data)
 9         bs=Bookserialize(data=request.data,many=False)
10         if bs.is_valid():
11             bs.save()
12             return Response(bs.data)
13         else:
14             return JsonResponse(bs.errors)
15 
16 class BookDetial(APIView):
17     def get(self,request,id):
18         book=Book.objects.filter(id=id).first()
19         bs=Bookserialize(book,context={'request': request},many=False)
20         return Response(bs.data)
21     def put(self,request,id):
22         book = Book.objects.filter(id=id).first()
23         bs=Bookserialize(book,data=request.data)
24         if bs.is_valid():
25             bs.save()
26             return Response(bs.data)
27     def delete(self,request,id):
28         book=Book.objects.filter(id=id).first()
29         book.delete()
30         return Response()

get方法裡傳入資料不用data

post需要data

put裡的data接受request.data

一對多:source 使用模型名.欄位

多對多:get_模型名  author=serializers.SerializerMethodField()