Проверка сериализаторов - объект TypeError ... 'UniqueTogetherValidator' не повторяется - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть модель под названием «следование», где один пользователь может следовать за другим, используя Django каркас отдыха. Я пытаюсь реализовать проверку, чтобы вы не могли следовать за кем-то дважды, и пробую встроенный UniqueTogetherValidator.

Вот соответствующие части моих models.py

class Following(models.Model):
    user = models.ForeignKey('User', related_name='user', on_delete=models.CASCADE)
    follower = models.ForeignKey('User', related_name='follower', on_delete=models.CASCADE)

И serializers.py:

class FollowingSerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.CharField(source='user.username')
    follower = serializers.CharField(source='follower.username')

    class Meta:
        model = Following
        fields = ['user', 'follower']

        validators = UniqueTogetherValidator(
            queryset = Following.objects.all(),
            fields = ['user', 'follower'],
            message = "You are already following that person!"
        )

У меня есть некоторые существующие данные:

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "user": "mike",
            "follower": "chelsea"
        },
        {
            "user": "mike",
            "follower": "chloe"
        }
    ]
}

Когда я пытаюсь добавить любой новый следующий объект, используя интерфейс API, я получаю эту ошибку:

TypeError at /followings/
'UniqueTogetherValidator' object is not iterable
Request Method: POST
Request URL:    http://127.0.0.1:8000/followings/
Django Version: 3.0.5
Exception Type: TypeError
Exception Value:    
'UniqueTogetherValidator' object is not iterable
...

Где я go ошибся? Заранее спасибо!

1 Ответ

1 голос
/ 25 апреля 2020

Как указано в https://www.django-rest-framework.org/api-guide/validators/#uniquetogethervalidator переменная validators в Meta должна быть списком,

ваш код должен быть

class FollowingSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.CharField(source='user.username')
follower = serializers.CharField(source='follower.username')

class Meta:
    model = Following
    fields = ['user', 'follower']

    validators = [
        UniqueTogetherValidator(
            queryset = Following.objects.all(),
            fields = ['user', 'follower'],
            message = "You are already following that person!"
        )
    ]
...