在TextField上使用URLField的优点是什么?

时间:2012-04-07 06:06:38

标签: django performance postgresql url django-models

据我了解,当你使用PostgreSQL数据库时,你应该总是使用TextField作为可变长度字符串,因为TextFieldCharField之间的速度差异可以忽略不计PostgreSQL 。我是Django的新手,并且正在考虑在我的数据库中使用TextField作为可变长度的URL。我想知道使用URLField是否有任何好处?使用TextField而不是URLField作为网址会被视为不良形式吗?

3 个答案:

答案 0 :(得分:59)

URLField实际上是CharField,支持基于Regexp的URL模式检查和在线验证器(由基于RegEx的验证器替换),如果不关心URL的长度限制,可以使用TextField

from django.core.validators import URLValidator

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

此外,使用CharField或TextField取决于您是否希望字段具有最大长度约束,以及哪种元素类型更适合编辑:textarea或input。在PostgreSQL方面,没有显着差异。

答案 1 :(得分:3)

https://docs.djangoproject.com/en/dev/ref/models/fields/#urlfield 当然,您可以使用CharField / TextField但处理用户输入并确保用户输入的内容是最新的。

来自源代码:

  

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

如果你看到URLField source code,你会发现它实际上是一个带有URL验证器的CharField。

还有其他准备使用的字段,例如EmailField,ImageField,* Field!

答案 2 :(得分:2)

试试这堂课:

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)