【问题标题】:Django: ModelViewSet router not working for update actionDjango:ModelViewSet 路由器不适用于更新操作
【发布时间】:2020-03-20 10:47:07
【问题描述】:

我正在将 ModelViewSet 和 Modelserializer 用于类似项目的博客。

这可能是我理解实现的困难;我无法通过 通过路由器调用它 使 update 动作起作用,只有 list 动作在我定义的路由上起作用

当我输入 url:127.0.0.1:8000/api/blogs/1,返回 ID 为 1 的博客编辑,它返回{"Detail": "Not Found."}

这是我的看法:

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

我也重写了序列化器类中的save和update方法,不知道ModelSerializer中的ModelViewSet是否需要。

class ArticleSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        article = Article.objects.create(
            article_title = self.validated_data['article_title'],
            article_content = self.validated_data['article_content'],
            ...
        )
        return article

    def update(self, instance, validated_data):
        instance.article_title = validated_data.get('article_title', instance.article_title)
        instance.article_content = validated_data.get('article_content', instance.article_content)
        ...
        instance.save()
        return instance

    class Meta:
        model = Article
        fields = ...

还有urls.py 文件:

router = DefaultRouter()
router.register(r'blogs', ArticleViewSet, basename='articles-list')
urlpatterns = router.urls

我的问题是: 1. 如何为 ModelViewSet 动作指定 url(在我的例子中是 update 动作)? 2. 仅定义一个 url 是否足以满足我对 every ModelViewSet 操作的所有需求?如果有怎么办?

我做错了什么?我是 DRF 的新手。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    关于您的问题:

    1) 在 api router 中注册ModelViewSet 后,它将为以下操作创建所有必需的 url。在您的情况下,它将如下:

    • 列表(对/api/blogs/的GET请求)
    • 检索(获取请求到 /api/blogs/{pk}/)
    • 创建(对/api/blogs/的POST请求)
    • 更新(PUT 请求到/api/blogs/{pk}/)(它将验证模型的所有字段)
    • 部分更新(PATCH 请求到/api/blogs/{pk}/)(它不会运行验证 - 你只能发送 您决定更改的字段)
    • 删除(删除请求到/api/blogs/{pk}/

    所以,基本上路由器会为您完成大部分关于注册视图集操作的工作。

    2) 我不完全明白,但如果我的猜测是正确的 - 答案与第一个问题相同。

    关于您做错了什么 - 我不确定,但您是否尝试在请求末尾附加斜杠(即不是 /api/blogs/1 而是 /api/blogs/1/

    【讨论】:

    • 对于 UPDATE 操作,我正在尝试相同的 URL /api/blogs/{pk}/,但它返回此错误:"details": "Not found"
    【解决方案2】:

    发现问题。我正在尝试网址localhost/api/blogs/1。它返回了这个:"Detail": "Not Found"。 这是因为没有使用 id 1 保存的实例。我保存的所有实例都有不同的 id,我以前没有注意到。放置可用的 id 后,它返回了所需的结果。

    【讨论】:

    • instance.save 放在哪里?
    • 在 serializers.py 文件中,在 update() 方法中,如果已定义。
    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多