You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF中如何让models.URLField支持接收相对URL?

解决DRF中models.URLField拒绝相对URL的问题

默认的models.URLField依赖Django的URLValidator,该验证器强制要求URL带协议(如http/https),所以提交相对路径会触发"insert a valid internet address"错误。下面是几种直接允许相对URL的方案:

1. 自定义支持相对URL的模型字段

直接继承URLField,替换默认验证器为允许无协议的版本:

from django.db import models
from django.core.validators import URLValidator

class RelativeURLField(models.URLField):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 关闭协议强制要求,允许相对URL
        self.validators = [URLValidator(require_protocol=False)]

之后在模型里用这个字段替代原生URLField:

class YourModel(models.Model):
    link = RelativeURLField()

2. 在序列化器层覆盖验证逻辑

如果不想改动模型,直接在DRF序列化器中修改字段的验证规则:

from rest_framework import serializers
from django.core.validators import URLValidator
from .models import YourModel

class YourSerializer(serializers.ModelSerializer):
    # 为URL字段指定允许相对路径的验证器
    link = serializers.URLField(validators=[URLValidator(require_protocol=False)])

    class Meta:
        model = YourModel
        fields = ['link']

要是需要更严格的相对路径校验(比如只允许以/开头的路径),可以自定义验证函数:

def validate_relative_path(value):
    if not value.startswith('/'):
        raise serializers.ValidationError("相对URL必须以/开头")
    if ' ' in value:
        raise serializers.ValidationError("URL不能包含空格")
    return value

class YourSerializer(serializers.ModelSerializer):
    link = serializers.CharField(validators=[validate_relative_path])

    class Meta:
        model = YourModel
        fields = ['link']

3. 全局修改URLValidator默认行为(谨慎使用)

如果项目中所有URLField都需要支持相对URL,可以全局修改验证器的默认设置,在settings.py中添加:

from django.core.validators import URLValidator
URLValidator.default_require_protocol = False

注意:这种方式会影响所有使用URLValidator的场景,可能导致原本需要绝对URL的字段也接受相对路径,需确认项目需求后再用。


内容的提问来源于stack exchange,提问作者keramat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:17:09