【问题标题】:Returning id value after object creation with django-rest-framework使用 django-rest-framework 创建对象后返回 id 值
【发布时间】:2013-09-19 20:32:03
【问题描述】:

我正在使用 django-rest-framework 通用视图通过 POST 请求在模型中创建对象。我想知道如何返回在 POST 之后创建的对象的 id,或者更一般地说,关于创建的对象的任何附加信息。

这是创建(并列出)对象的视图类:

class DetectorAPIList(generics.ListCreateAPIView):
    serializer_class = DetectorSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    parser_classes = (MultiPartParser, FileUploadParser,)

    def pre_save(self, obj):
        obj.created_by = self.request.user.get_profile()

    def get_queryset(self):
        return (Detector.objects
                .filter(get_allowed_detectors(self.request.user))
                .order_by('-created_at'))

模型序列化器:

class DetectorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Detector
        fields = ('id', 'name', 'object_class',
              'created_by', 'public', 'average_image', 'hash_value')
        exclude = ('created_by',)

谢谢!

【问题讨论】:

  • 创建新对象后,您只需要返回数据库中存在的最后一个 id。此链接可能会对您有所帮助。 stackoverflow.com/questions/2548493/…
  • 谢谢你,但我希望在 django-rest-framework 中实现这一点。我想知道有没有比那个级别更低的解决方案。
  • 我猜如果DetectorSerializer继承自ModelSerializer,post方法应该返回创建的模型,我们可以看到DetectorSerializer吗?
  • 非常感谢@mariodev。对不起,我的问题是客户端。虽然我仔细检查了我是否收到了数据,但我做错了。发送有关创建对象的所有数据。再次感谢!
  • 没问题@kahlo。只需自己回答问题,然后选择您的答案作为正确答案。

标签: python django post http-post django-rest-framework


【解决方案1】:

这里,DetectorSerializer 继承自 ModelSerializer 以及您的视图继承自泛型 ListCreateAPIView 所以当 POST向视图发出请求,它应该返回 id 以及在 Serializer 的字段中定义的所有属性。

【讨论】:

    【解决方案2】:

    因为当我遇到同样的问题时,我花了几分钟来解析这个答案,所以我想我会为后人总结:

    通用视图 ListCreateApiView确实返回创建的对象。

    这在文档listcreateapiview 中也很清楚:视图扩展createmodelmixin,其中指出:

    如果创建了一个对象,这将返回一个 201 Created 响应,并将该对象的序列化表示作为响应的主体。

    因此,如果您遇到此问题,请仔细查看您的客户端!

    post$.pipe(tap(res => console.log(res)))
    

    应该打印新创建的对象(假设 rxjs6 和 ES6 语法)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多