gpt4 book ai didi

django - 如何更新单行上的单列?

转载 作者:行者123 更新时间:2023-12-05 06:44:19 25 4
gpt4 key购买 nike

我正在尝试为我的 Django REST 应用程序编写一个简单的更新 View ,但我不知道该怎么做。我遇到了从 403 到 500 的一系列错误。

基本上,我有一个表“Foo”,我想将“事件”字段从“真”设置为“假”。这是我目前的观点:

class DisableFoo(generics.UpdateAPIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = FooSerializer
queryset = Foo.objects.all()

def perform_update(self, serializer):
queryset = Foo.objects.filter(pk = self.request.data['id'])
queryset.update(active = False)

但是,这会导致 AssertionError:

Expected view DisableFoo to be called with a URL keyword argument named "pk".
Fix your URL conf, or set the '.lookup_field' attribute on the view correctly.

最佳答案

你不应该发送 id您要使用 request.data 更新但在 url 内的行.

所以如果你现在打的是这样的:

/api/foo/

试试

/api/foo/<id>/

当然这还不够。您还应该考虑更多的事情。

您正在 Hook perform_update方法。但这不太可能是正确的。 perform_update被调用以使用 serializer.save() 更新整个对象因此它仅在 serializer.is_valid() 时被调用.

这意味着您必须发送有效的 Foo目的。但这不是你想要的。您只需要更新 Foo 的单个字段目的。所以这里正确的方法是使用 partial_update . partial_update将在您制作 PATCH 时使用请求 /api/foo/<id>/

因此,如果您发送 PATCH请求 /api/foo/<id>/active=0在 request.data 内部,DRF 将自动更新对象而无需任何进一步的代码更改。刚刚使用

class DisableFoo(generics.UpdateAPIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = FooSerializer
queryset = Foo.objects.all()

但这最终会公开您所有的模型字段以进行更新。所以你可以覆盖 partial_update像这样的方法:

def partial_update(self, request, *args, **kwargs):
instance = self.get_object()
instance.active = False
instance.save(update_fields=['active'])
return Response()

另一种方法

DRF 支持创建 extra extra-actions通过@detail_route@list_route装饰器。

您可以使用 @detail_route创建自定义禁用操作。考虑以下代码和平:

class FooViewSet(viewsets.GenericViewSet):
queryset = Foo.objects.all()
serializer_class = FooSerializer

@detail_route(methods=['post'])
def disable(self, request, pk=None):
instance = self.get_object()
instance.active = False
instance.save(update_fields=['active'])
return Response('done')

制作POST请求 /api/foo/<id>/disable将调用 disable我们刚刚编写并禁用 foo 的方法<id> 下的实例.

这样你就可以避免使用 PATCH 的要求请求方法。

关于django - 如何更新单行上的单列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29910411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com