DRF视图集 - 不创建,但如果对象已存在则返回

问题描述 投票:0回答:2

是否可以覆盖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)
django django-rest-framework django-rest-viewsets
2个回答
1
投票

他们是一个功能

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

这将获得对象如果存在或创建对象,如果它不存在,这将返回两个变量第一个(在这种情况下“实例”)将是它创建并且已经退出的对象,你将得到肯定的对象和第二个变量(在此“创建”中)将是一个布尔值,以标识对象是否已创建或已存在。如果创建了对象,它将为True,如果对象已经退出,则为false。但无论是创建还是存在,您都会获得第一个变量中的对象。


1
投票

这将返回一个查询集

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

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

所以要返回1,传递一个kwarg(可能是pk)并返回与get_queryset()不同的东西

© www.soinside.com 2019 - 2024. All rights reserved.