使用URLField相比TextField有哪些优势?

48
据我所知,当您使用PostgreSQL数据库时,对于可变长度的字符串,应始终使用TextField,因为在PostgreSQL中,TextFieldCharField之间的速度差异可以忽略不计。 我对Django相对较新,考虑在我的数据库中使用TextField来存储可变长度的URL。 我想知道是否使用URLField有任何优点? 对于URL而言,是否使用TextField而不是URLField会被认为是不好的做法?
3个回答

74

URLField实际上是CharField,支持基于正则表达式的URL模式检查和在线验证器(已被基于正则表达式的验证器替换),如果您不关心URL的长度限制,可以使用TextField。

from django.core.validators import URLValidator

# in model
field = models.TextField(validators=[URLValidator()])

此外,使用CharField或TextField取决于您是否希望在字段上设置最大长度约束,以及哪种元素类型更适合进行编辑:textarea还是input。在PostgreSQL方面,没有明显的区别。


17
记录一下,IE不能加载超过2,000个字符的URL,因此您可以将URLFieldmax_length设置为2000,然后就完成了。 - mlissner
关于URLField的弃用有任何参考吗? - pravin
2
@pravin,被弃用的不是URLField,而是它之前的验证器。该验证器通过在线访问URL来进行验证,现在已被替换为正则表达式验证器以检查URL格式的验证。 - okm
1
URLField默认的最大长度为200,除非您指定其他值。 - Vaibhav Vishal

5

试试这个类:

class LongURLField(TextField):
    description = 'Long URL'

    def __init__(self, verbose_name=None, name=None, **kwargs):
        TextField.__init__(self, verbose_name, name, **kwargs)
        self.validators.append(validators.URLValidator())

    def formfield(self, **kwargs):
        # As with TextField, this will cause URL validation to be performed
        # twice.
        defaults = {
            'form_class': forms.URLField,
        }
        defaults.update(kwargs)
        return super(LongURLField, self).formfield(**defaults)

1
将max_length设置为2000,你就拥有了完美的字段 :) - gabn88

3

https://docs.djangoproject.com/en/dev/ref/models/fields/#urlfield

当然,您可以使用CharField / TextField,但处理用户输入并确保用户输入的内容符合要求由您来负责。

从源代码中可以看到:

# 与CharField一样,这将导致URL验证被执行

如果您查看URLField源代码,您会发现实际上它是带有URL验证器的CharField。

此外还有其他可供使用的字段,例如EmailField、ImageField、*Field!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接