Представление Django REST ModelViewSet возвращает 404 после PATCH
У меня есть представление ModelViewSet в проекте django rest framework. Я пытаюсь отфильтровать документы, которые не являются живыми, то есть не находятся в основном представлении. Для фильтрации я использую параметры: http://localhost:8000/documents?is_live=false
. У меня есть список записей. После установки true на одном из объектов я получаю 404 ошибку
"GET /api/documents/?is_live=false HTTP/1.1" 200
test {'pk': '2', 'partial': True}
Not Found: /api/documents/2/
Not Found: /api/documents/2/
"PATCH /api/documents/2/ HTTP/1.1" 404
"GET /api/documents/?is_live=false HTTP/1.1" 200
Забавно, что когда у меня есть этот код ниже, без filter(is_live=True)
работает:
def get_queryset(self):
if self.request.query_params.get('is_live'):
return self.queryset.filter(is_live=False)
return self.queryset.all()
Код моего представления и пользовательский фильтр (django_filters) приведены ниже:
class DocumentFilter(dfilters.FilterSet):
is_live = dfilters.BooleanFilter(field_name='is_live')
class Meta:
model = Document
fields = ['is_live']
class DocumentViewSet(viewsets.ModelViewSet):
serializer_class = DocumentSerializer
queryset = Document.objects.all()
filterset_class = DocumentFilter
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
search_fields = ['title', 'category']
ordering_fields = [
'title',
'category',
]
def update(self, request, *args, **kwargs):
print("test", args, kwargs)
kwargs['partial'] = True
return super().update(request, *args, **kwargs)
@action(detail=True, methods=['patch'])
def get_queryset(self):
if self.request.query_params.get('is_live'):
return self.queryset.filter(is_live=False)
return self.queryset.filter(is_live=True)
EDIT
models.py
class Document(models.Model):
title = models.CharField(max_length=100,blank=True)
description = models.CharField(max_length=1000, blank=True)
is_live = models.BooleanField(default=True)
class Meta:
verbose_name = "Document"
verbose_name_plural = "Documents"
def __str__(self):
return self.title
project.urls
urlpatterns = [
...
path('api/', include('api.urls')),
...
]
api.url
apirouter = routers.DefaultRouter()
...
apirouter.register('documents', DocumentViewSet)
...
Я хотел бы иметь возможность частичного обновления объекта на отфильтрованном представлении.