Как сериализовать использование django rest_framework для ManyToManyFields со сквозной моделью

У меня есть модель рецепта, которая содержит поле M2M объекта IngredientType. Это поле, например, componentent_list, использует печально известную «сквозную» модель через объект Ingredient, который добавляет дополнительные данные в свой IngredientType. это мои классы:

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

Я попытался их сериализовать с помощью 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') 

но при попытке запустить это, я получаю AttributeError: объект «IngredientType» не имеет атрибута «componentent_type»,

ясно, когда я меняю линию:

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

чтобы:

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

то есть изменить Сериализатор, он работает, но без сбора данных Ингредиента. Я использовал эту ссылку: включить посредника (через модель) в ответы в Django Rest Framework как ссылку, но, очевидно, он не решил мои проблемы.
Любая помощь будет оценена по достоинству. tnx, Nitzan

One Solution collect form web for “Как сериализовать использование django rest_framework для ManyToManyFields со сквозной моделью”

В вашей модели Recipe для поля ManyToManyField вы имеете ManyToManyField указывающий на IngredientType .

На вашем RecipeSerializer поле RecipeSerializer не использует IngredientTypeSerializer а скорее IngredientSerializer .

Это ошибка. (И он объясняет сообщение об ошибке – фактическая модель у source не имеет атрибута, который ищет сериализатор.)

Помимо этого, ваша схема именования является массово запутанной. «Рецепт» в порядке, но то, что вы называете «IngredientType», должно быть, просто «Ingredient», а затем вы должны найти отличное имя для сквозной таблицы. (Может быть, «RecipeIngredientDetails»)

Надеюсь, это поможет.

  • Django REST Framework - Сериализация необязательных полей
  • Включить посредника (через модель) в ответы в Django Rest Framework
  • Django REST Framework и python-social-auth для пользователя регистрации / входа в систему
  • Используйте разные сериализаторы для ввода и вывода из службы
  • Django Rest Framework Сериализаторы: как получить список всех дочерних объектов в родительском сериализаторе?
  • Как создать API для входа в систему с помощью Django Rest Framework?
  • Добавление дополнительных данных в результаты Django Rest Framework для всего набора результатов
  • Добавление много сериализатора в поле вложенного сериализатора
  • Как оптимизировать или упростить операции по копированию объектов django? (не может использовать модули и типы db)
  • Django Rest Framework 3.0: сохранение вложенных, многозначных отношений
  • Серийный анализатор остальной среды всегда возвращает False для is_valid
  • Python - лучший язык программирования в мире.