DRF Viewset - не создавать, но возвращать, если объект уже существует - PullRequest
0 голосов
/ 21 апреля 2019

Можно ли переопределить создание 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)

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

их функция

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

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

1 голос
/ 21 апреля 2019

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

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

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

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

...