2013-10-04 9 views
7

Ho un modello di ricetta che contiene un campo M2M di un oggetto IngredientType. Questo campo, noto anche come ingrediente_list, utilizza il famoso modello 'through' tramite un oggetto Ingredient che aggiunge dati extra al mio IngredientType. queste sono le mie classi:Come serializzare usando django rest_framework a ManyToManyFields con un modello Through

class Recipe(models.Model): 
    user_profile = models.ForeignKey(UserProfile, null=True, blank = True) 
    name = models.CharField(max_length=200) 
    photo1 = models.ImageField(upload_to = 'images/recipies', help_text="This photo will show by default") 
    ingredient_list = models.ManyToManyField(IngredientType,through='Ingredient') 

class Ingredient(models.Model): 
    ingredient_type = models.ForeignKey(IngredientType) 
    recipe = models.ForeignKey(Recipe) 
    amount = models.IntegerField() 
    units = models.CharField(max_length=4,choices=UNIT, 
           default=None, null=True, blank = True) 

class IngredientType(models.Model): 
    name = models.CharField(max_length=200) 
    plural_name = models.CharField(max_length=200) 
    photo = models.ImageField(upload_to = 'images/ingredients') 
    is_main = models.BooleanField() 

Ho provato la serializzazione utilizzando il rest_framework:

class IngredientTypeSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = IngredientType 
     fields=('name', 'plural_name', 'photo', 'is_main') 

class IngredientSerializer(serializers.HyperlinkedModelSerializer): 
    ingredient_type = IngredientTypeSerializer(source = 'ingredient_type') 
    amount = serializers.Field(source='ingredient_type.amount') 
    units = serializers.Field(source='ingredient_type.units') 
    recipe = serializers.Field(source='Recipe.name') 
class Meta: 
    model = Ingredient 
    fields=('amount', 'units') 

class RecipeSerializer(serializers.ModelSerializer): 
    ingredient_list = IngredientSerializer(source='ingredient_list', many=True, read_only = True) 
    class Meta: 
     model = Recipe 
     fields = ('user_profile', 'name','photo1','ingredient_list') 

ma quando si cerca di eseguire questo, ottengo un AttributeError: oggetto 'IngredientType' non ha un attributo 'ingredient_type'

chiaramente, quando cambio la linea:

ingredient_list = IngredientSerializer(source='ingredient_list', many=True, read_only = True) 

a:

ingredient_list = IngredientTypeSerializer(source='ingredient_list', many=True, read_only = True) 

cioè, cambiare il Serializzatore, funziona, ma senza di me andare a prendere i dati ingrediente. ho usato questo link: Include intermediary (through model) in responses in Django Rest Framework come riferimento, ma ovviamente non ha risolto i miei problemi.
Qualsiasi aiuto sarebbe apprezzato. TNX, Nitzan

risposta

6

del modello Recipe, per il campo ingredient_list avete un ManyToManyField che punta a IngredientType.

Sul RecipeSerializer campo ingredient_list non utilizza il IngredientTypeSerializer ma piuttosto il IngredientSerializer.

Questo è l'errore. (E spiega il messaggio di errore - il modello attuale su source non ha l'attributo cercato dal serializzatore.)

Oltre questo, lo schema di denominazione è estremamente confuso. "Recipe" va bene, ma quello che chiami "IngredientType" dovrebbe probabilmente essere solo "Ingredient" e quindi dovresti trovare un nome distinto per la tabella through. (Forse "RecipeIngredientDetails")

Spero che questo aiuti.

Problemi correlati