📜  django 通过 rest 进行多对多后更新方法 - Python (1)

📅  最后修改于: 2023-12-03 14:40:47.786000             🧑  作者: Mango

Django REST多对多关系的更新方法

在Django REST框架中,多对多关系是经常使用的一种关系类型。如何更新这种关系显然是非常重要的。本文将介绍如何通过Django REST框架对多对多关系进行更新。

准备工作

在开始之前,我们需要定义一个多对多关系的模型,假设我们有两个模型:AuthorBook,他们之间的关系是多对多关系,我们可以这样定义他们的模型:

class Author(models.Model):
    name = models.CharField(max_length=50)
    books = models.ManyToManyField('Book')

class Book(models.Model):
    name = models.CharField(max_length=50)
按照关系ID进行更新

首先,我们可以通过直接传递关系ID对多对多关系进行更新。假设我们要更新ID为1的作者的书籍列表,我们可以这样做:

author = Author.objects.get(id=1)
book_ids = [1, 2, 3] # 需要更新的书籍ID列表
author.books.set(book_ids)

在Django REST框架中,我们可以通过一个自定义的函数来实现这个功能:

class AuthorViewSet(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer

    @action(detail=True, methods=['put'])
    def update_books(self, request, pk=None):
        author = self.get_object()
        book_ids = request.data.get('book_ids', [])
        author.books.set(book_ids)
        serializer = self.get_serializer(author)
        return Response(serializer.data)

在这个例子中,我们定义了一个名为update_books的函数,这个函数需要接收一个作者ID和一个书籍ID列表。在函数里面,我们从数据库中获取了对应的作者对象,并使用set()方法对作者的书籍列表进行更新。

然后,我们可以在路由中定义这个函数的映射:

router = routers.DefaultRouter()
router.register(r'authors', AuthorViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

现在,我们可以通过HTTP PUT请求来更新作者对象了:

PUT /authors/1/update_books HTTP/1.1
Content-Type: application/json

{
    "book_ids": [1, 2, 3]
}
按照关系对象进行更新

除了通过ID来更新多对多关系外,我们还可以直接传递关系的对象进行更新。假设我们要将名为Book1的书籍添加到ID为1的作者的书籍列表中,我们可以这样做:

author = Author.objects.get(id=1)
book = Book.objects.get(name='Book1')
author.books.add(book)

同样的,在Django REST框架中,我们也可以通过一个自定义的函数来实现这个功能:

class AuthorViewSet(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer

    @action(detail=True, methods=['put'])
    def add_book(self, request, pk=None):
        author = self.get_object()
        serializer = BookSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        book = serializer.save()
        author.books.add(book)
        serializer = self.get_serializer(author)
        return Response(serializer.data)

在这个例子中,我们定义了一个名为add_book的函数,这个函数需要接收一个作者ID和一个书籍对象。在函数里面,我们使用DRF的序列化功能来自动将书籍对象序列化为JSON格式,并保存到数据库中。然后,我们使用add()方法将书籍对象添加到作者的书籍列表中。

然后,我们可以在路由中定义这个函数的映射:

router = routers.DefaultRouter()
router.register(r'authors', AuthorViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

现在,我们可以通过HTTP PUT请求来添加新书籍给作者:

PUT /authors/1/add_book HTTP/1.1
Content-Type: application/json

{
    "name": "Book1"
}
总结

本文介绍了如何通过Django REST框架更新多对多关系,主要包括按照关系ID进行更新和按照关系对象进行更新。我们通过自定义函数和DRF的序列化功能来实现这些功能。这些技巧可以帮助我们更方便地使用Django REST框架来处理多对多关系。