2012-05-06 10 views
6

Estoy trabajando con algunos recursos django-tastypie simples con el siguiente problema:¿Cómo puedo hacer que Django-Tastypie anule un recurso si ya existe?

Imagine que estoy construyendo un sistema de clasificación simple. Tengo un recurso, llámalo Rating que tiene un User y un Comment. Cada usuario tiene como máximo una calificación por comentario.

Me gustaría hacer un recurso genérico que tome una tupla ('user', 'comment'). Luego, cada vez que hago un POST con un nuevo Rating, me gustaría comprobar los campos user y para ver si ya existe una calificación que coincida con ambos campos. Si lo hace, sobrescriba el recurso existente; de ​​lo contrario, cree un nuevo recurso (para que cualquier llamada API pase siempre por el unique_together de Django).

Estoy trabajando con obj_get como punto de partida, pero tengo dificultades para entender cómo anularlo correctamente para obtener este comportamiento.

Respuesta

6

Tras el debate en el IRC en #tastypie:

Se recomienda no alterar el comportamiento API estándar, ya que esto puede ser peligroso en el sentido de que los clientes no verán un comportamiento consistente a través de la API.

Una solución es dejar que Tastypie devuelva una respuesta 4xx al intentar crear el Rating, y en este caso el cliente obtendría PATCH la calificación existente.

Si, sin embargo, el aumento en el rendimiento es realmente necesario, solo debe modificar el comportamiento si el cliente lo solicita formalmente. Lo que en su caso significaría agregar un parámetro replace_existing_rating=True a la solicitud POST.

Así, en su caso, si qué decide que necesita el aumento de rendimiento, usted podría:

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() 
Cuestiones relacionadas