Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:ModelViewSet路由器无法执行更新操作_Django_Django Rest Framework - Fatal编程技术网

Django:ModelViewSet路由器无法执行更新操作

Django:ModelViewSet路由器无法执行更新操作,django,django-rest-framework,Django,Django Rest Framework,我将ModelViewSet和Modelserializer用于类似博客的项目 这可能是我难以理解执行情况;我无法通过通过路由器调用使更新操作正常工作,只有列表操作正在使用我定义的路由 当我放置url:127.0.0.1:8000/api/blogs/1以返回ID为1的blog进行编辑时,它返回{“详细信息”:“未找到”。 我的看法是: class ArticleViewSet(viewsets.ModelViewSet): queryset = Article.objects.all(

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

这可能是我难以理解执行情况;我无法通过通过路由器调用使更新操作正常工作,只有列表操作正在使用我定义的路由

当我放置url:
127.0.0.1:8000/api/blogs/1
以返回ID为1的blog进行编辑时,它返回
{“详细信息”:“未找到”。

我的看法是:

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
我还重写了serializer类中的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 = ...
以及
url.py
文件:

router = DefaultRouter()
router.register(r'blogs', ArticleViewSet, basename='articles-list')
urlpatterns = router.urls
我的问题是: 1.如何为ModelViewSet操作指定URL(在我的例子中是
更新
操作)? 2.仅定义一个url是否足以满足我对每个ModelViewSet操作的所有需求?如果是,怎么做


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

关于您的问题:

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

  • 列表(获取请求到
    /api/blogs/
  • 检索(获取请求到
    /api/blogs/{pk}/
  • 创建(将请求发布到
    /api/blogs/
  • 更新(将请求放入
    /api/blogs/{pk}/
    )(它将验证模型的所有字段)
  • 部分更新(对
    /api/blogs/{pk}/
    的补丁请求)(它将不运行验证-您只能发送 已决定更改的字段)
  • 删除(删除对
    /api/blogs/{pk}/
    的请求)
所以,路由器基本上为您完成了注册视图集操作的大部分工作

2) 我不完全明白,但如果我的猜测是正确的,答案和第一个问题是一样的


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

关于您的问题:

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

  • 列表(获取请求到
    /api/blogs/
  • 检索(获取请求到
    /api/blogs/{pk}/
  • 创建(将请求发布到
    /api/blogs/
  • 更新(将请求放入
    /api/blogs/{pk}/
    )(它将验证模型的所有字段)
  • 部分更新(对
    /api/blogs/{pk}/
    的补丁请求)(它将不运行验证-您只能发送 已决定更改的字段)
  • 删除(删除对
    /api/blogs/{pk}/
    的请求)
所以,路由器基本上为您完成了注册视图集操作的大部分工作

2) 我不完全明白,但如果我的猜测是正确的,答案和第一个问题是一样的


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

发现了问题。我正在尝试url
localhost/api/blogs/1
。它返回的是:
“详细信息”:“未找到”

这是因为没有保存id为1的实例。我所有保存的intance都有不同的ID,这是我以前没有注意到的。放置可用ID后,它返回所需的结果

找到了问题。我正在尝试url
localhost/api/blogs/1
。它返回的是:
“详细信息”:“未找到”

这是因为没有保存id为1的实例。我所有保存的intance都有不同的ID,这是我以前没有注意到的。放置可用ID后,它返回所需的结果

对于更新操作,我尝试相同的url
/api/blogs/{pk}/
,但它返回以下错误:
“详细信息”:“未找到”
。对于更新操作,我尝试相同的url
/api/blogs/{pk}/
,但它返回以下错误:
“详细信息”:“未找到”