【问题标题】:Serializers validation - TypeError... 'UniqueTogetherValidator' object is not iterable序列化器验证 - TypeError ...“UniqueTogetherValidator”对象不可迭代
【发布时间】:2020-08-09 05:29:06
【问题描述】:

我有一个名为“following”的模型,一个用户可以使用 Django rest 框架来关注另一个用户。我正在尝试实施验证,以便您不能两次关注某人,并尝试使用内置的 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
...

我哪里做错了?提前致谢!

【问题讨论】:

    标签: django validation serialization django-rest-framework


    【解决方案1】:

    正如https://www.django-rest-framework.org/api-guide/validators/#uniquetogethervalidator 中提到的,Meta 下的validators 变量应该是一个列表,

    你的代码应该是

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

    【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 2015-10-23
    • 2017-08-27
    • 2018-10-10
    • 2021-12-13
    • 2019-02-20
    • 2020-03-27
    • 2018-12-12
    相关资源
    最近更新 更多