#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()