2012-05-06 1 views
6

Я работаю с некоторыми простыми django-tastypie Ресурсы со следующей проблемой:Как я могу заставить Django-Tastypie переопределить ресурс, если он уже существует?

Представьте, что я строю простую рейтинговую систему. У меня есть ресурс, назовите его Rating, который имеет как User, так и Comment. У каждого пользователя не более одного рейтинга за комментарий.

Я хотел бы создать общий ресурс, который берет кортеж ('user', 'comment'). Затем, всякий раз, когда я делаю POST с новым Rating, я бы хотел, чтобы он проверил поля user и comment, чтобы узнать, существует ли рейтинг, соответствующий обеим этим полям. Если это так, перезапишите существующий ресурс, иначе создайте новый ресурс (так что любой вызов API всегда будет передавать Django unique_together).

Я работаю с obj_get в качестве отправной точки, но с трудом понимаю, как правильно переопределить его, чтобы получить это поведение.

ответ

6

После обсуждения на IRC в #tastypie:

Рекомендуется не изменять стандартное поведение API, так как это может быть опасно в том смысле, что клиенты не будут видеть последовательное поведение через API.

Одно из решений - позволить Tastypie вернуть ответ 4xx при попытке создать Rating, и в этом случае клиент будет 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() 

 Смежные вопросы

  • Нет связанных вопросов^_^