【问题标题】:object-level validation in django serializers does not recognize functiondjango 序列化程序中的对象级验证无法识别函数
【发布时间】:2021-07-02 01:25:11
【问题描述】:
class serializer_blahblah(serializers.ModelSerializer):
    """Serializer for ProfileUsefulRecommendations."""

    profile_id = serializers.UUIDField()
    recommendation_id = serializers.UUIDField()

    class Meta:
        """Meta class."""

        fields = (
            "id",
            "profile_id",
    ...

一切都与这个序列化程序完美配合,但是我决定添加对象级验证
这是发生了什么:

    def validate(self, data):
        recommendation_id = str(data["recommendation_id"])
        print("recommendation: ", recommendation_id)
        validate_recommendation_id(recommendation_id=recommendation_id)
        print(validate_recommendation_id(recommendation_id=recommendation_id))
        return data

打印出来:

recommendation:  3a232d0d-0705-4775-8bae-0e2f3d69c96c

它甚至不识别该功能....

但是,如果我在单个字段序列化程序中使用完全相同的函数,它会很顺利。但简而言之,我需要它作为对象级别

添加函数代码:

def validate_recommendation_id(recommendation_id):
    try:
        Recommendation.objects.get(id=recommendation_id)
    except Recommendation.DoesNotExist as exception:
        raise serializers.ValidationError(
            {f"{recommendation_id}": "does not exist"}
        ) from exception
    return recommendation_id

【问题讨论】:

  • 拜托,能把函数的代码加一下吗?

标签: django validation django-rest-framework django-serializer


【解决方案1】:

实际上,伙计们,我已经想出了这样的解决方案。 我定义了验证函数而不是验证函数

Class CheckIfObjectHasId(queryset, lookup_object)

后来我在序列化程序中调用了它:

class serializer_blahblah(serializers.ModelSerializer):
    """Serializer for ProfileUsefulRecommendations."""

    profile_id = serializers.UUIDField(
        validators=[
             CheckIfObjectHasId(queryset=Profile.object.all(), lookup_object="id"
        ]
    )

【讨论】:

    【解决方案2】:

    这就是您为每个字段添加验证的方式。

    class serializer_blahblah(serializers.ModelSerializer):
        recommendation_id = serializers.UUIDField()
    
        def validate_recommendation_id(self, recommendation_id):
            return recommendation_id
    
    

    你不要在validate方法中调用它。

    【讨论】:

    • 正如我提到的那样有效,但我需要在验证中这样做
    • 我有几个 id 并且相信如果我创建每个内场函数将是多余的,因此我相信 validation() 函数将继续......但是为什么它不调用函数?
    • recommendation_id = serializers.UUIDField() 你显然有一个 id。我想我不能帮助你,因为我不明白问题出在哪里。
    • 其实没有,我有两个id。也可能您知道我可以在此处发布之前编辑代码,因此我删除了其他字段。
    猜你喜欢
    • 2016-08-11
    • 2019-05-06
    • 2014-11-25
    • 2020-04-16
    • 1970-01-01
    • 2020-12-09
    • 2018-09-29
    • 2020-08-14
    • 2020-11-25
    相关资源
    最近更新 更多