Как добавить в сериализатор поле с значением из другого сериализатора?

Имею сериализатор для отображения всех пользователей сайта. В котором есть SerializerMethodField() поле "is_subscribed" отображающее подписан ли текущий авторизованный юзер на отображаемого пользователя. Это же поле хочу использовать в другом сериализаторе. Есть ли способ "скопировать" это поле чтобы не писать такой-же метод в другом сериализаторе ?

class ReUserSerializer(UserSerializer):
    """Сериализатор модели Юзер GET запрос."""

    is_subscribed = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = ('email', 'id', 'username', 'first_name', 'last_name',
                  'is_subscribed')

    def get_is_subscribed(self, obj):

        request_user = self.context.get('request').user.id
        queryset = Subscription.objects.filter(author=obj.id,
                                               follower=request_user).exists()
        return queryset

сериализатор в который хочу скопировать поле "is_subscribed"

class SubscriptionSerializer(serializers.ModelSerializer):
    email = serializers.ReadOnlyField(source='author.email')
    id = serializers.ReadOnlyField(source='author.id')
    username = serializers.ReadOnlyField(source='author.username')
    first_name = serializers.ReadOnlyField(source='author.first_name')
    last_name = serializers.ReadOnlyField(source='author.last_name')
    is_subscribed = serializers.ReadOnlyField(source='???')

    recipes = serializers.SerializerMethodField()
    recipes_count = serializers.SerializerMethodField()

    class Meta:
        model = Subscription
        fields = ('email', 'id', 'username', 'first_name', 'last_name',
                  'is_subscribed', 'recipes', 'recipes_count', 'author', 'follower')
        extra_kwargs = {'author': {'write_only': True},
                        'follower': {'write_only': True}}

    def get_recipes(self, obj):
        queryset = Recipe.objects.filter(author=obj.author.id)
        serializer = RecipeInSubscriptionSerializer(queryset, many=True)
        return serializer.data

    def get_recipes_count(self, obj):
        queryset = Recipe.objects.filter(author=obj.author.id).count()
        return queryset

    def validate(self, data):
        print(data)
        if data['author'] == data['follower']:
            raise serializers.ValidationError('Нельзя подписаться на себя!')
        if Subscription.objects.filter(author=data['author'],
                                       follower=data['follower']).exists():
            raise serializers.ValidationError('Вы уже подписаны!')
        return data

Ответы (1 шт):

Автор решения: Алексей Стародубцев

Используйте mixin! Оба класса наследуйте от SubscribeMixin, помимо основного родителя, где:

class SubscribeMixin:
    is_subscribed = serializers.SerializerMethodField()

    def get_is_subscribed(self, obj):
        user_id = obj.id if isinstance(obj, User) else obj.author.id
    
        request_user = self.context.get('request').user.id
        queryset = Subscription.objects.filter(author=user_id,
                                               follower=request_user).exists()
        return queryset

Единственный нюанс в том что в первом случае у вас obj - юзер, а во втором - подписка, поэтому user_id = obj.id if isinstance(obj, User) else obj.author.id

→ Ссылка