Альтернатива для StringRelatedField

Я пытаюсь получить следующих пользователей с их именами вместо PrimaryKey, я пытался использовать StringRelatedField. Это сработало для GET запроса, но не позволяет писать. Не смог найти никаких альтернатив для этого. Я хочу получить результат в формате json следующим образом:

{
    "id": 1,
    "user": "admin",
    "following": "user_1"
}

Я предполагаю, что вместо использования StringRelatedField я должен переопределить create в сериализаторах, я прав?

enter image description here enter image description here

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 модель раздел документации .

Вернуться на верх