2012-05-17 18 views
7

In Django e Tastypie sto cercando di capire come trattare correttamente con molti a molti "attraverso" i rapporti, come quelli trovati qui: https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationshipsdjango-tastypie e molti a molti "attraverso" relazioni

Ecco i miei modelli di esempio:

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) 

Ora il mio file 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' 

sto cercando di basare il mio codice su questo esempio: http://pastebin.com/L7U5rKn9

Purtroppo, con questo codice ottengo questo errore:

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

Qualcuno sa cosa sta succedendo qui? O come posso includere il nome dell'ingrediente in RecipeIngredientResource? Grazie!

EDIT:

forse ho trovato me stesso l'errore. ToManyField deve essere indirizzato verso Ingredient e non RecipeIngredient. Vedrò se questo fa il lavoro.

MODIFICA:

Nuovo errore ... qualche idea? L'oggetto "" ha un attributo vuoto "titolo" e non consente un valore predefinito o nullo.

risposta

3

lei ha citato:

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

C'è un approccio migliore se [Tastypie M2M] (http://blog.eugene-yeo.in/django-tastypie-manytomany-through.html) (vecchio blog non è in linea: https://github.com/9gix/eugene-yeo.in/blob/master/content/web/django-tastiepie-m2m.rst)

In breve sintesi, Invece di ToManyField agli ingredienti, Io uso ToManyField verso il ThroughModel. E personalizzare i kwargs attribute come funzione di richiamata che restituisce il Queryset ThroughModel.

Update (2014 aprile)

Questa risposta è fatto molto tempo fa. Non sono sicuro se è ancora utile.

+1

Si prega di includere i punti importanti della risposta qui, su questo post. Stack Overflow non è qui per essere un deposito di collegamenti a cose, ma per essere un deposito di risposte. Questo è anche un modo molto inappropriato per promuovere il tuo blog. –

+0

Duh, Ok, .. Ho copiato la risposta qui ... Perché il post è troppo lungo ... – Yeo

+2

Link sembra essere morto al momento – msc

-2

Ho avuto lo stesso problema di te. Per risolverlo, ho semplicemente rimosso il campo ToMany (come in RecipeResource) dall'API. Questo ha funzionato per noi perché il modello aveva ancora il campo più volte (solo non l'API) e si poteva ancora interrogare la relazione interrogando il modello intermedio.

+0

Questo in realtà non risponde alla domanda. – fluffels

Problemi correlati