Как упростить код и надо ли?
Работаю на API в Django REST Framework.И вот есть такая проблемка:есть ModelViewSet и в их функциях происходит один и тот же запрос в базу, одна и та же проверка в блоке if.Можно ли как-то это дело вынести в отдельную функцию и если да, то как?
class LinkViewSet(ModelViewSet):
permission_classes = (IsAuthenticated,)
serializer_class = LinkSerializer
queryset = Link.objects.all()
def retrieve(self, request, *args, **kwargs):
instance = Link.objects.filter(Q(user_id=self.request.user.id) & Q(id=kwargs["pk"])).first()
if not instance:
return Response(data="Not found", status=status.HTTP_404_NOT_FOUND)
return super().retrieve(request, *args, **kwargs)
def partial_update(self, request, *args, **kwargs):
instance = Link.objects.filter(Q(user_id=self.request.user.id) & Q(id=kwargs["pk"])).first()
if not instance:
return Response(data="Not found", status=status.HTTP_404_NOT_FOUND)
return super().partial_update(request, *args, **kwargs)
Ответы (1 шт):
Автор решения: gimntut
→ Ссылка
Весь viewset можно переписать следующим образом:
class LinkViewSet(ModelViewSet):
permission_classes = (IsAuthenticated,)
serializer_class = LinkSerializer
queryset = Link.objects.all()
def get_queryset(self):
qs = super().get_queryset()
qs = qs.filter(user_id=self.request.user.id)
# qs будет передан в GenericAPIView.get_object,
# который будет искать по pk и создаст 404-ответ, если нет подходящего элемента
return qs
Результат выполнения будет такой же, как и в коде из вопроса