Как сериализовать использование 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 3.4. Сериализация внешнего ключа и загрузка файла изображения
  • Django REST Framework Создание пользовательского пользователя
  • Добавление API APIView в Django REST Framework Browsable API
  • Тестирование аутентификации в Django Rest Framework Views - невозможно проверить подлинность при тестировании
  • Django Rest Framework ListField и DictField
  • Как получить доступ к serializer.data в родительском классе ListSerializer в DRF?
  • Django - Как создать POST с внешним ключом, определенным в URL?
  • Рамка Django rest: вложенный объект, не передающий validated_data
  • Python - лучший язык программирования в мире.