Представление 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)
...

Я хотел бы иметь возможность частичного обновления объекта на отфильтрованном представлении.

Вернуться на верх