使用Django REST框架编写API,并使用Serializer和ViewSet处理多对多关系。
首先,定义模型和其关系。假设我们有一个模型'书籍”和一个模型'作者”,它们之间有一个多对多关系。
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
接下来,我们需要为API编写Serializer和ViewSet。
from rest_framework import serializers, viewsets
from .models import Author, Book
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ('id', 'name')
class BookSerializer(serializers.ModelSerializer):
authors = AuthorSerializer(many=True)
class Meta:
model = Book
fields = ('id', 'title', 'authors')
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
现在,我们可以通过向'/books/”端点发送POST请求来创建新的书籍。我们可以在请求正文中包含作者的ID,例如:
{
"title": "New Book",
"authors": [1, 2, 3]
}
其中1、2、3是作者的ID。
在我们的ViewSet中,需要覆盖create
方法,以处理与多对多关系有关的额外步骤。
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
def create(self, request, *args, **kwargs):
author_ids = request.data.pop('authors', [])
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
book = serializer.instance
authors = Author.objects.filter(id__in=author_ids)
book.authors.add(*authors)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
在上面的代码中,我们从请求数据中弹出作者ID,以便序列化器能够创建新的'Book”实例。然后,我们调用perform_create
方法以创建新的书籍。然后,我们查询拥有这些ID的作者实例,并将它们添加到新创建的书籍实例中。最后,我们返回HTTP响应,