Django Serializer 中的字段验证未被调用

问题描述 投票:0回答:1

我正在使用 Django 作为后端构建一个密码管理器。

当用户提交一组新的凭据以将其存储在其保管库中时,如果 url 字段的数据中尚不存在,我想添加前缀“http://”。

我正在尝试使用 Django 序列化器中的字段验证器功能来验证 url 字段,这是我当前的序列化器:

class StoredCredentialSerializer(serializers.ModelSerializer):
    url = serializers.URLField()

    class Meta:
        model = StoredCredential
        fields = ['user_id', 'title', 'username', 'password', 'url']

    def validate_url(self, value):
        validator = URLValidator()
        try:
            # Validating the URL format using Django's URLValidator
            validator(value)
        except ValidationError:
            # If the URL format is invalid, try to correct it by adding the prefix
            if not value.startswith(('http://', 'https://')):
                value = 'http://' + value  # Add 'http://' prefix to the URL
            
            try:
                # Validate the modified URL format
                validator(value)
            except ValidationError:
                raise serializers.ValidationError("Invalid URL format")
        
        return value

当我向它传递一个不带“http://”或“https://”的 url 时,它会返回 400 错误请求错误,这表明“validate_url”函数未被调用。我不确定为什么,因为我似乎遵循了 Django 文档中的格式。任何帮助将不胜感激!

python django-rest-framework django-serializer
1个回答
0
投票

如果未调用 Django 序列化器中的字段验证,则此问题背后可能有多种原因。以下是一些常见的故障排除步骤:

  • 确保 validate_ 方法存在:

    确保您在序列化器类中为要验证的字段定义了一个名为 validate_ 的方法。例如,如果您想验证名为 email 的字段,则该方法应命名为 validate_email。

  • 检查序列化器命名约定:

    确保您的序列化程序命名正确,并且在 Django 应用程序的视图或其他部分中正确使用。应该在使用序列化器的地方正确引用它。

  • 验证序列化器调用:

    仔细检查您是否在视图中或在使用序列化器的任何地方正确调用序列化器。如果序列化器没有被正确使用或初始化,验证方法将不会被触发。

  • 检查序列化器上下文:

    如果验证逻辑依赖于上下文数据,请确保向序列化器传递适当的上下文。实例化序列化器时可以传递上下文。

  • 检查字段命名和结构:

    确认序列化器中的字段名称与模型中的字段名称匹配。另外,验证字段结构以确保它与您编写的验证逻辑一致。

  • 检查序列化器和模型关系:

    确保序列化器类与正确的模型关联,并且字段在序列化器和模型之间正确映射。

  • 调试和日志记录:

    在验证方法中引入日志记录或调试语句,以检查它们是否被调用或者这些方法中是否发生错误。

以下是如何在 Django 序列化程序中定义字段验证方法的示例:

蟒蛇

from rest_framework import serializers

class MySerializer(serializers.Serializer):
email = serializers.EmailField()

def validate_email(self, value):
    # Validation logic for email field
    # Return validated value or raise a ValidationError if invalid
    if not value.endswith('@example.com'):
        raise serializers.ValidationError("Only emails from example.com domain are allowed.")
    return value

确保您要验证的字段正确遵循命名约定 (validate_)。

如果检查这些点后问题仍然存在,请检查使用序列化器的代码并检查序列化器和关联视图/模型的整体结构可能会更深入地了解问题。

© www.soinside.com 2019 - 2024. All rights reserved.