DRF Viewset — не создавать, но возвращать, если объект уже существует

#django #django-rest-framework #django-rest-viewsets

#django #django-rest-framework #django-rest-viewsets

Вопрос:

Возможно ли переопределить create Viewset, чтобы сначала проверить, существует ли объект, и, если да, вернуть этот объект, а не создавать его?

В частности, в моем viewset я переопределил функцию create следующим образом:

 try:
    item = Item.objects.get(recipe__id=self.request.data['recipe'])
except Item.DoesNotExist:
    serializer.save(owner=self.request.user)
  

Есть идеи, как я могу передать элемент обратно? В настоящее время это просто возвращает входные данные. Даже если я сериализую и возвращаю элемент, похоже, это не работает, как показано ниже:

 try:
    item = Item.objects.get(
        recipe__id=self.request.data['recipe'])
    serializer = UserItemSerializer(item)
    return Response(serializer.data, status=status.HTTP_201_CREATED)
except Item.DoesNotExist:
    serializer.save(owner=self.request.user)
  

Комментарии:

1. можете ли вы поделиться полной реализацией набора представлений, пожалуйста?

Ответ №1:

это функция

 instance , created = Item.objects.get_or_create(parameter)
  

это позволит получить объект, если он существует, или создать объект, если он не существует, это вернет две переменные: 1-я (в данном случае «экземпляр » ) будет объектом, который не имеет значения, который он создает и уже завершает работу, вы получите объект наверняка, а 2-я переменная (в этом случае «созданный») будет логическим значением, чтобы определить, создан ли объект или уже существует . это будет True, если объект создан, и false, если объект уже завершается. но вы получите объект в 1-й переменной, независимо от того, создан он или существует.

Ответ №2:

Это вернет набор запросов

 class UserViewSet(viewsets.ModelViewSet):
    permission_classes = [permissions.IsAuthenticated, ]
    serializer_class = UserSerializer

    def get_queryset(self):
        return User.objects.all()
  

Итак, чтобы вернуть только 1, передайте kwarg (возможно, pk) и верните что-то отличное от get_queryset()