Django:ModelViewSet路由器无法执行更新操作
我将ModelViewSet和Modelserializer用于类似博客的项目 这可能是我难以理解执行情况;我无法通过通过路由器调用使更新操作正常工作,只有列表操作正在使用我定义的路由 当我放置url: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(
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}/
关于您做错了什么-我不确定,但您是否尝试在请求末尾添加斜杠(即不是
/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}/
关于您做错了什么-我不确定,但您是否尝试在请求末尾添加斜杠(即不是
/api/blogs/1
,而是/api/blogs/1/
)发现了问题。我正在尝试urllocalhost/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}/
,但它返回以下错误:“详细信息”:“未找到”
。