Получение 404 not found при попытке обновить данные с помощью запроса в Django
Я пытаюсь добавить status в одно из полей таблицы DB, где сначала я проверяю, присутствует ли переданное ID
в таблице, если да, то добавляю.
ID
в основном происходит из переменной пути API, которую я получаю и передаю в запрос. Ниже приведен API, который я использую для вызова класса view.
"/notify/<int:pk>/mark_as_seen/"
"/notify/1/mark_as_seen/" # where 1 is the record Id in the DB table
Ниже представлен код, который запрашивает таблицу DB и проверяет, доступен ли переданный Id.
class MarkAsSeenView(BaseAuthenticationMixin, generics.RetrieveAPIView):
permission_classes = [permissions.IsAuthenticated]
serializer_class = SeenSerializer
queryset = Seen.objects.all()
def filter_queryset(self, queryset):
qs = super().filter_queryset(queryset=queryset)
qs = qs.exclude(seen_by_user=self.request.user).exclude(user=self.request.user)
return qs
def retrieve(self, request, *args, **kwargs):
obj = self.get_object()
obj.seen_by_user.add(self.request.user)
return super().get(request, *args, **kwargs)
Теперь, когда я вызываю этот View через вышеупомянутый API, он прекрасно работает в первую очередь, где он добавляет одну запись в таблицу, как видно, с идентификатором пользователя. Теперь проблема в том, что после выполнения всех ожидаемых действий он снова переходит к методу filter_queryset
и пытается снова искать тот же ID
, который уже был исключен в предыдущей итерации, из-за чего он не получил ту же ID
, скажем 1
запись в таблице, в результате чего 404
не найден как response
.
Я не понимаю, почему он снова возвращается для поиска того же самого от retrieve
к filter_queryset
. Может ли кто-нибудь указать, в чем именно здесь проблема, потому что я отладил весь вид, но не понимаю, почему он прыгает туда-сюда.
Любая помощь будет очень признательна. Заранее спасибо.
Я думаю, что эта строка может быть проблемой и может перезапустить фильтр queryset из-за вызова конечной точки get с самого начала
return super().get(request, *args, **kwargs)
Можете попробовать следующее?
def retrieve(self, request, *args, **kwargs):
obj = self.get_object()
obj.seen_by_user.add(self.request.user)
serializer = self.get_serializer(obj)
return Response(serializer.data)