2013-10-04 7 views
7

Ich habe ein Rezept-Modell, das ein M2M-Feld eines IngredientType-Objekts enthält. Dieses Feld, aka ingredient_list, verwendet das berüchtigte "Through" -Modell über ein Ingredient-Objekt, das zusätzliche Daten zu meinem IngredientType hinzufügt. das sind meine Klassen:Serialisieren mit Django rest_framework ein ManyToManyFields mit einem Through-Modell

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

habe ich versucht, die Serialisierung ihnen die rest_framework mit:

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') 

aber bei dem Versuch, dies zu laufen, erhalte ich ein Attribut: ‚IngredientType‘ Objekt kein Attribut 'ingredient_type'

klar, wenn ich die Zeile:

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

zu:

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

das heißt, ändern Sie den Serializer, es funktioniert, aber ohne mich Daten die Zutaten zu holen. Ich habe diesen Link verwendet: Include intermediary (through model) in responses in Django Rest Framework als Referenz, aber offensichtlich hat es meine Probleme nicht gelöst.
Jede Hilfe wäre willkommen. tnx, Nitzan

Antwort

6

Auf Ihrem Recipe Modell, für das ingredient_list Feld haben Sie einen ManyToManyField zeigt auf IngredientType.

Auf Ihrem RecipeSerializer verwendet das Feld ingredient_list nicht das IngredientTypeSerializer, sondern das IngredientSerializer.

Dies ist der Fehler. (Und es erklärt die Fehlermeldung - das tatsächliche Modell an der source hat nicht das Attribut, nach dem vom Serializer gesucht wird.)

Darüber hinaus ist Ihr Namensschema massiv verwirrend. "Rezept" ist in Ordnung, aber was Sie "IngredientType" nennen, sollte wahrscheinlich nur "Ingredient" sein und dann sollten Sie einen eindeutigen Namen für die durchgehende Tabelle finden. (Vielleicht "RecipeIngredientDetails")

Ich hoffe, dass hilft.