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

时间:2019-04-21 07:08:20

标签: django django-rest-framework django-rest-viewsets

是否有可能重写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 个答案:

答案 0 :(得分: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()不同的内容

答案 1 :(得分:1)

它们是一个函数

b2

这将获取对象(如果存在)或创建对象(如果不存在),这将返回两个变量1st(在这种情况下为“ instance”)将是与它无关紧要的对象,它已经创建并且已经退出,您将确定获得对象,第二个变量(在此“创建的”中)将是一个布尔值,用于标识对象是已创建还是已经存在。如果创建了对象,则为True,如果已经存在,则为false。但是无论对象是创建的还是存在的,您都会在第一个变量中得到它。