anon123123
anon123123

Reputation: 25

Serializers validation - TypeError... 'UniqueTogetherValidator' object is not iterable

I have a model called 'following' where one user can follow another, using the Django rest framework. I am trying to implement a validation so that you can't follow someone twice, and trying the built-in UniqueTogetherValidator.

Here are the relevant parts of my 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)

And 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!"
        )

I have some existing data:

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"
        }
    ]
}

When I try to add any new following object using the API interface, I get this error:

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
...

Where did I go wrong? Thanks in advance!

Upvotes: 0

Views: 985

Answers (1)

Gaurav Waghmare
Gaurav Waghmare

Reputation: 404

As mentioned in https://www.django-rest-framework.org/api-guide/validators/#uniquetogethervalidator the validators variable under Meta should be a list,

your code should be

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!"
        )
    ]

Upvotes: 1

Related Questions