Как добавить в сериализатор поле с значением из другого сериализатора?
Имею сериализатор для отображения всех пользователей сайта. В котором есть 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