Reputation: 25
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
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