【问题标题】:DRF nested router serializer source fields from url来自 url 的 DRF 嵌套路由器序列化程序源字段
【发布时间】:2021-09-15 05:21:08
【问题描述】:

我有一个作者和书籍模型。一个作者有很多书

class Author(Model):
    id = UUIDField(primary_key=True, default=uuid4, editable=False)
    name = CharField(max_length=50)
    email = CharField(max_length=50)

class Book(Model):
    id = UUIDField(primary_key=True, default=uuid4, editable=False)
    name = CharField(max_length=50)
    author = ForeignKey(Author, on_delete=models.CASCADE)

在我的 urls.py 中

author_router = SimpleRouter()
author_router.register(
    r"author", AuthorViewSet, basename=author
)

nested_author_router = NestedSimpleRouter(author_router, r"author", lookup="author")
nested_author_router.register(r"book", BookViewSet)

在我的 searlizers.py 中

class BookSerializer(ModelSerializer):
    class Meta:
        model = Book
        fields = (
            "id",
            "name",
            "author",
        )
        extra_kwargs = {
            "id": {"required": False},
            "author": {"required": False},
        }

class AuthorSerialzer(ModelSerializer):
        class Meta:
            model = Author
            fields = (
                "id",
                "name",
                "email",
            )
            extra_kwargs = {
                "id": {"required": False},
            }

在views.py中

class BookViewSet(GenericViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer


    def create(self, request, author_pk):
        data = request.data
        data["author"] = author_pk
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save() 
        return Response(serializer.data)

由于书籍与作者有关​​,并且我使用嵌套路由器,因此 curl 调用看起来像

curl --location --request POST 'localhost:8000/author/1/book' --data '{"name": "Book Name"}'

在我的BookViewSet 中,我最终在调用序列化程序is_valid 方法之前手动将 author_pk 添加到数据对象中。有没有办法从 URL 路由或任何更好的方法来指定源?

【问题讨论】:

  • 不。以后可以有像GET - /author/1/book这样的GET

标签: django django-rest-framework django-views drf-nested-routers


【解决方案1】:

在这种情况下,您可以将author_pk 传递给save() 以自动设置新创建书籍的作者ID,如here 所述:

    def create(self, request, author_pk):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save(author_id=author_pk) 
        return Response(serializer.data)

【讨论】:

  • 我正在测试这个让我回来
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
相关资源
最近更新 更多