2012-04-11 21 views
8

Estoy construyendo una API tastypie Django, y tengo un problema con la adición de elementos en ManyToMany relacionesTastypie, añadir un elemento a muchos a muchos

ejemplo, models.py

class Picture(models.db): 
    """ A picture of people""" 
    people = models.ManyToManyField(Person, related_name='pictures', 
     help_text="The people in this picture", 
    ) 

class Person(models.db): 
    """ A model to represet a person """ 
    name = models.CharField(max_length=200, 
     help_text="The name of this person", 
    ) 

recursos:

class PictureResource(ModelResource): 
    """ API Resource for the Picture model """ 
    people = fields.ToManyField(PersonResource, 'people', null=True, 
     related_name="pictures", help_text="The people in this picture", 
    ) 
class PersonResource(ModelResource): 
    """ API Resource for the Person model """ 
    pictures = fields.ToManyField(PictureResource, 'pictures', null=True, 
     related_name="people", help_text="The pictures were this person appears", 
    ) 

mi problema es que me gustaría tener un punto final add_person en mi recurso de imagen. Si uso PUT, entonces necesito especificar todos los datos en la imagen Si uso PATCH, aún necesito especificar todas las personas en la imagen. Por supuesto, podría simplemente generar la URL /api/picture/:id/add_people y allí podría manejar mi problema. El problema con eso es que no se siente limpio.

Otra solución sería la de generar el punto final /api/picture/:id/people, y no me podía hacer GET, POST, PUT, como si fuera un nuevo recurso, pero no sé cómo implementar esta y parece extraño para crear nuevas personas bajo este recurso.

¿Alguna idea?

+0

me preguntó alguna manera la misma pregunta http://stackoverflow.com/questions/8613522/how-to-put-product-to-cart-via-tasytpie-api – seb

+1

@seb Lo sentimos Busqué mi problema y no encontré tu pregunta. Si lo desea, puedo eliminar mi pregunta, pero, por favor, cambie su nombre, ya que "¿Cómo poner el producto en el carrito a través de tasytpie API?" es demasiado específico –

+0

@seb - su pregunta aún está abierta, ¡no veo que haya aceptado la respuesta! – Mutant

Respuesta

4

Implementé esto anulando la función save_m2m del Recurso API. Aquí hay un ejemplo usando sus modelos.

def save_m2m(self, bundle): 
    for field_name, field_object in self.fields.items(): 
     if not getattr(field_object, 'is_m2m', False): 
      continue 

     if not field_object.attribute: 
      continue 

     if field_object.readonly: 
      continue 

     # Get the manager. 
     related_mngr = getattr(bundle.obj, field_object.attribute) 
      # This is code commented out from the original function 
      # that would clear out the existing related "Person" objects 
      #if hasattr(related_mngr, 'clear'): 
      # Clear it out, just to be safe. 
      #related_mngr.clear() 

     related_objs = [] 

     for related_bundle in bundle.data[field_name]: 
      # See if this person already exists in the database 
      try: 
       person = Person.objects.get(name=related_bundle.obj.name) 
      # If it doesn't exist, then save and use the object TastyPie 
      # has already prepared for creation 
      except Person.DoesNotExist: 
       person = related_bundle.obj 
       person.save() 

      related_objs.append(person) 

     related_mngr.add(*related_objs)