2012-05-17 29 views
7

En Django y Tastypie Estoy tratando de encontrar la manera de tratar adecuadamente con muchos a muchos "a través de" relaciones, como las que se encuentran aquí: https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationshipsdjango-tastypie y muchos a muchos "a través de" relaciones

Aquí están mis modelos de ejemplo:

class Ingredient(models.Model): 
    name = models.CharField(max_length=100) 
    description = models.TextField() 

class RecipeIngredients(models.Model): 
    recipe = models.ForeignKey('Recipe') 
    ingredient = models.ForeignKey('Ingredient') 
    weight = models.IntegerField(null = True, blank = True) 

class Recipe(models.Model): 
    title = models.CharField(max_length=100) 
    ingredients = models.ManyToManyField(Ingredient, related_name='ingredients', through='RecipeIngredients', null = True, blank = True) 

Ahora mi archivo api.py:

class IngredientResource(ModelResource): 
    ingredients = fields.ToOneField('RecipeResource', 'ingredients', full=True) 

    class Meta: 
     queryset = Ingredient.objects.all() 
     resource_name = "ingredients" 


class RecipeIngredientResource(ModelResource): 
    ingredient = fields.ToOneField(IngredientResource, 'ingredients', full=True) 
    recipe = fields.ToOneField('RecipeResource', 'recipe', full=True) 

    class Meta: 
     queryset= RecipeIngredients.objects.all() 


class RecipeResource(ModelResource): 
    ingredients = fields.ToManyField(RecipeIngredientResource, 'ingredients', full=True) 

class Meta: 
    queryset = Recipe.objects.all() 
    resource_name = 'recipe' 

estoy tratando de basar mi código en este ejemplo: http://pastebin.com/L7U5rKn9

Desafortunadamente, con este código me sale este error:

"error_message": "'Ingredient' object has no attribute 'recipe'" 

¿Alguien sabe lo que está pasando aquí? ¿O cómo puedo incluir el nombre del ingrediente en RecipeIngredientResource? ¡Gracias!

EDIT:

que puede haber encontrado el error mismo. ToManyField debe dirigirse hacia Ingredient y no RecipeIngredient. Veré si esto hace el trabajo.

EDITAR:

Nuevo error ... alguna idea? El objeto '' tiene un atributo 'título' vacío y no permite un valor predeterminado o nulo.

Respuesta

3

Usted mencionó:

I may have found the error myself. ToManyField should be directed toward Ingredient and not RecipeIngredient. I'll see if this does the job.

Hay un enfoque mejor, aunque [Tastypie M2M] (http://blog.eugene-yeo.in/django-tastypie-manytomany-through.html) (antiguo blog está en línea: https://github.com/9gix/eugene-yeo.in/blob/master/content/web/django-tastiepie-m2m.rst)

En breve resumen, en lugar de ToManyField a los ingredientes, Yo uso ToManyField hacia el ThroughModel. Y personalice el attribute kwargs para que sea una función de devolución de llamada que devuelve el ThroughModel Queryset.

actualización (2014 abril)

Esta respuesta se hizo hace mucho tiempo. No estoy seguro de si todavía es útil.

+1

Incluya los puntos importantes de la respuesta aquí, en esta publicación. Stack Overflow no está aquí para ser un depósito de enlaces a cosas, sino para ser un depósito de respuestas. Esta es también una forma muy inapropiada de promocionar tu blog. –

+0

Duh, Ok, .. Copiaré la respuesta aquí ... Porque la publicación es demasiado larga ... – Yeo

+2

El enlace parece estar muerto en este momento – msc

-2

Tuve el mismo problema que tú. Para resolverlo, simplemente eliminé el campo ToMany (como en RecipeResource) de la API. Esto funcionó para nosotros porque el modelo todavía tenía el campo manytomany (simplemente no la API), y aún así podía consultar la relación consultando el modelo intermedio.

+0

Esto realmente no responde la pregunta. – fluffels

Cuestiones relacionadas