Django 如何在ModelViewSet中获取super().create()创建的模型?

Django 如何在ModelViewSet中获取super().create()创建的模型?,django,django-rest-framework,Django,Django Rest Framework,我正在尝试获取由ModelViewSet的create()方法中的super().create()创建的模型的副本。最简单的方法是什么 我有一个ModelViewSet,它接受一个通用的POST请求,我知道这很好,因为我在数据库中得到了一条新记录。我要做的是获取刚刚创建的对象,以便将其pk返回给客户端。但是,以下措施不起作用: class ItemViewSet(ViewSet.ModelViewSet): 型号=项目 # ... def创建(self、request、*args、**kwarg

我正在尝试获取由ModelViewSet的
create()
方法中的
super().create()
创建的模型的副本。最简单的方法是什么

我有一个ModelViewSet,它接受一个通用的
POST
请求,我知道这很好,因为我在数据库中得到了一条新记录。我要做的是获取刚刚创建的对象,以便将其
pk
返回给客户端。但是,以下措施不起作用:

class ItemViewSet(ViewSet.ModelViewSet):
型号=项目
# ...
def创建(self、request、*args、**kwargs):
super().create(请求、*args、**kwargs)#成功创建实例
instance=self.get_object()#抛出错误
返回响应({'status':'success','pk':instance.pk})
与其他DRF ModelViewSet方法一样,我希望
self.get_object()
能够为我创建实例,尽管这通常只能在“详细路线”中使用。我得到的是以下错误:
AssertionError:预期使用名为“pk”的URL关键字参数调用视图cularstockviewset。修复URL配置,或在视图上正确设置“.lookup\u field”属性。


任何洞察都将不胜感激

通过进一步调试,我找到了答案。为了子孙后代,以下是我的工作
create()
方法:

def创建(self、request、*args、**kwargs):
response=super().create(请求,*args,**kwargs)
instance=response.data
返回响应({'status':'success','pk':实例['pk']})

使用确实无法获取对象,因为Django使用参数执行过滤。实际上,
get\u对象
实现看起来像:

这些
self.kwargs
不可用,因此
get\u对象
调用失败

但是,我们可以在此处修补该函数并使用:

class ItemViewSet(ViewSet.ModelViewSet):
型号=项目
# ...
def创建(self、request、*args、**kwargs):
serializer=self.get\u序列化程序(data=request.data)
serializer.is\u有效(raise\u exception=True)
self.perform\u创建(序列化程序)

返回响应({'status':'success','pk':serializer.instance.pk})
我知道我很晚才回答这个问题。但是,如果有人坚持这类问题,@JohnnyHammersticks提供的答案很有效。但问题是,此解决方案将创建两次对象(对于我的情况,我还有
perform\u create
函数)。处理这种情况的最好办法是:

def创建(self、request、*args、**kwargs):
serializer=self.get\u序列化程序(data=request.data)
serializer.is\u有效(raise\u exception=True)
self.perform\u创建(序列化程序)
如果序列化程序.u有效():
instance=serializer.data
pk=数据['id']
返回响应({'status':'success','pk':实例['pk']})

+1表示彻底。不过,这个解决方案对我来说有点困惑,而且可能对下一个家伙来说。它还深入到底层实现中,并且随着框架的发展,可能需要更多的维护。有没有什么东西让我遗漏了这个更好的答案?@JohnnyHammersticks:有点遗憾的是,没有返回它构建的实例,而这只是一个
return
语句。因此,在这种情况下,我们可以将上述内容简化很多,只需对其进行修补可能更为优雅。然而,这里的想法是,你得到的是对象,而不是它的序列化,因为序列化可以“省略”重要的细节,等等。啊,好的观点。如果我不得不回到这个方法,我可以看到那些“缺失”字段让我发疯。将此标记为答案。谢谢请注意,
response.data
实际上不是所创建模型的实例,而是一个
rest\u framework.utils.serializer\u helpers.ReturnDict
def get_object(self):
    # ...
    queryset = self.filter_queryset(self.get_queryset())

    # Perform the lookup filtering.
    lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field

    # ...

    filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
    obj = get_object_or_404(queryset, **filter_kwargs)

    # May raise a permission denied
    self.check_object_permissions(self.request, obj)

    return obj
class ItemViewSet(viewsets.ModelViewSet):
    model = Item
    # ...

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        return Response({'status': 'success', 'pk': serializer.instance.pk})