2013-10-04 10 views
7

Mam model receptury zawierający pole M2M obiektu IngredientType. To pole, a także lista składników, używa znanego modelu "przez" za pośrednictwem obiektu Ingredient, który dodaje dodatkowe dane do mojego IngredientType. to są moje zajęcia:Sposób przekształcania do postaci szeregowej przy użyciu elementu django rest_framework a ManyToManyFields z modelem przelotowym

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

Próbowałem szeregowania je za pomocą 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') 

ale podczas próby uruchomienia tego dostaję AttributeError: obiekt „IngredientType” ma atrybut 'ingredient_type'

wyraźnie, kiedy zmienić linię:

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

do:

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

czyli zmienić serializer, to działa, ale bez pobierania mnie dane składnik. Użyłem tego linku: Include intermediary (through model) in responses in Django Rest Framework jako punkt odniesienia, ale oczywiście nie rozwiązał on moich problemów.
Każda pomoc zostanie doceniona. tnx, Nitzan

Odpowiedz

6

modelu Recipe, na polu ingredient_list masz ManyToManyField skierowaną IngredientType.

Na swoim RecipeSerializer w polu ingredient_list nie jest używany IngredientTypeSerializer, ale raczej IngredientSerializer.

To jest błąd. (I wyjaśnia komunikat o błędzie - rzeczywisty model na source nie ma szukanego atrybutu przez serializator.)

Poza tym twój schemat nazewnictwa jest bardzo mylący. "Receptura" jest w porządku, ale to, co nazywasz "IngredientType", powinno być po prostu "Składnikiem", a wtedy powinieneś znaleźć odrębną nazwę dla całej tabeli. (Może "RecipeIngredientDetails")

Mam nadzieję, że to pomaga.

Powiązane problemy