Альтернатива для StringRelatedField
Я пытаюсь получить следующих пользователей с их именами вместо PrimaryKey, я пытался использовать StringRelatedField. Это сработало для GET запроса, но не позволяет писать. Не смог найти никаких альтернатив для этого. Я хочу получить результат в формате json следующим образом:
{
"id": 1,
"user": "admin",
"following": "user_1"
}
Я предполагаю, что вместо использования StringRelatedField я должен переопределить create в сериализаторах, я прав?
model.py
class Follow(models.Model):
user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='follower'
)
following = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='following'
)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['user', 'following'],
name='unique_user_following'
)
]
def __str__(self) -> str:
return self.following
serializer.py
class FollowSerializer(serializers.ModelSerializer):
user = serializers.SlugField(
read_only=True,
default=serializers.CurrentUserDefault()
)
# following = serializers.StringRelatedField()
class Meta:
model = Follow
fields = ('id', 'user', 'following',)
validators = [
serializers.UniqueTogetherValidator(
queryset=Follow.objects.all(),
fields=('user', 'following',)
)
]
def validate_following(self, value):
if value == self.context.get('request').user:
raise serializers.ValidationError(
'You can not follow yourslef!'
)
return value
views.py
class FollowViewSet(viewsets.ModelViewSet):
serializer_class = FollowSerializer
def get_queryset(self):
new_queryset = Follow.objects.filter(user=self.request.user)
return new_queryset
def perform_create(self, serializer):
serializer.save(user=self.request.user)
А SlugRelatedField позволяет также выполнить поиск при записи и таким образом получить в данном случае пользователя с заданным именем пользователя.
Таким образом, вы можете реализовать это как:
from django.contrib.auth import get_user_model
class FollowSerializer(serializers.ModelSerializer):
user = serializers.SlugField(
read_only=True,
default=serializers.CurrentUserDefault()
)
following = serializers.SlugRelatedField(
slug_field='username',
queryset=get_user_model().objects.all()
)
class Meta:
model = Follow
fields = ('id', 'user', 'following',)
# …
# …
Примечание: Обычно лучше использовать
settings.AUTH_USER_MODEL[Django-doc] для ссылки на модель пользователя, чем использоватьUserмодель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка наUserмодель раздел документации .

