【问题标题】:DRF Viewset - Do not create but return if object already existsDRF Viewset - 如果对象已经存在,则不创建但返回
【发布时间】:2019-09-10 20:03:45
【问题描述】:

是否可以重写 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)

【问题讨论】:

  • 你能分享一下viewset的完整实现吗?

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


【解决方案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() 不同的东西

【讨论】:

    【解决方案2】:

    它们是一个函数

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 2023-03-29
      • 1970-01-01
      • 2012-12-14
      • 2023-03-08
      • 1970-01-01
      • 2019-01-21
      • 2014-10-08
      相关资源
      最近更新 更多