【问题标题】:How can I make Django-Tastypie override a resource if it already exists?如果 Django-Tastypie 已经存在,如何让它覆盖资源?
【发布时间】:2012-05-06 21:52:08
【问题描述】:

我正在使用一些简单的 django-tastypie 资源,但存在以下问题:

假设我正在构建一个简单的评级系统。我有一个资源,称为Rating,它同时具有UserComment。每个用户每条评论最多有一个评分。

我想制作一个采用元组 ('user', 'comment') 的通用资源。然后,每当我使用新的Rating 进行 POST 时,我希望它检查usercomment 字段以查看是否已经存在与这两个字段匹配的评级。如果是,则覆盖现有资源,否则创建一个新资源(这样任何 API 调用都将始终传递 Django 的unique_together)。

我以 obj_get 为起点,但很难理解如何正确覆盖它以获得这种行为。

【问题讨论】:

    标签: python django tastypie


    【解决方案1】:

    关注#tastypie中关于IRC的讨论:

    建议不要更改标准 API 行为,因为这可能很危险,因为客户端不会看到整个 API 的一致行为。

    一种解决方案是让 Tastypie 在尝试创建 Rating 时返回 4xx 响应,在这种情况下,客户端将 PATCH 现有评级。

    但是,如果确实需要提高性能,则只有在客户正式提出要求时才应更改行为。在您的情况下,这意味着将 replace_existing_rating=True 参数添加到 POST 请求中。

    因此,在您的情况下,如果您确实决定需要提升性能,您可以:

    class CommentResource(ModelResource):
        def obj_create(self, bundle, request=None, **kwargs):
            if bundle.data.get("replace_existing_rating", False):
                try:
                    bundle.obj = self._meta.object_class._default_manager.get(**conditions)
                except self._meta.object_class.DoesNotExist:
                    bundle.obj = self._meta.object_class()
    

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 2021-07-09
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2012-08-11
      • 1970-01-01
      相关资源
      最近更新 更多