Как работать с вложенными полями сериализатора в Djnago rest framework?

У меня есть вложенный сериализатор (AmountSerializer). Мне нужно поле meal_name в одном ViewSet. Но когда это поле вложено, мне не нужно, чтобы оно было видно в конечной точке (в MealSerializer). Как исключить поле из вложенного сериализатора, если оно на самом деле вложенное? serializers.py:

class AmountSerializer(serializers.ModelSerializer):
    ingredient_name= serializers.ReadOnlyField(source='ingredient_name.name')
    -->#meal_name = serializers.ReadOnlyField(source='meal.name')
  
    class Meta:
        model = IngredientAmount    
        fields = ('ingredient_name','amount','meal_name')

class MealSerializer(serializers.ModelSerializer):
    type_name= serializers.ReadOnlyField(source='type.name')
    ingredients = serializers.SlugRelatedField(read_only=True, slug_field='name', many=True)   
    amount = AmountSerializer(read_only=True,  many=True,source='meal_id')
    
    class Meta:
        model = Meal
        fields = ('id', 'name', 'type_name', 'recipe', 'photo', 'ingredients','amount')

Я бы предпочел использовать трюк для исключения некоторых полей, которые не нужны в определенных ситуациях. Вы можете унаследовать свой сериализатор от ExcludeFieldsModelSerializer и исключить любые поля, которые вы хотите, чтобы сериализатор не сериализовал это поле.

class ExcludeFieldsModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `exclude_fields` argument that
    controls which fields should be excluded from the serializer.
    Plagiarised from https://www.django-rest-framework.org/api-guide/serializers/#dynamically-modifying-fields
    """

    def __init__(self, *args, **kwargs):
        # Don't pass the 'exclude_fields' arg up to the superclass
        exclude_fields = kwargs.pop('exclude_fields', None)

        # Instantiate the superclass normally
        super(ExcludeFieldsModelSerializer, self).__init__(*args, **kwargs)

        if exclude_fields is not None:
            # Drop any fields that are specified in the `exclude_fields` argument.
            drop = set(exclude_fields)
            for field_name in drop:
                self.fields.pop(field_name)


class AmountSerializer(ExcludeFieldsModelSerializer):
    ingredient_name= serializers.ReadOnlyField(source='ingredient_name.name')
    meal_name = serializers.CharField(read_only=True, source='meal.name')


    class Meta:
        model = IngredientAmount    
        fields = ('ingredient_name','amount','meal_name')


class MealSerializer(serializers.ModelSerializer):
    type_name= serializers.ReadOnlyField(source='type.name')
    ingredients = serializers.SlugRelatedField(read_only=True, slug_field='name', many=True)   
    amount = AmountSerializer(read_only=True,  many=True, source='meal_id', exclude_fields={'meal_name'})
    
    class Meta:
        model = Meal
        fields = ('id', 'name', 'type_name', 'recipe', 'photo', 'ingredients','amount')
Вернуться на верх