Advantages to using URLField over TextField?

2019-03-17 03:36发布

As I understand it you should always use a TextField for a variable length string when your using a PostgreSQL database because the speed difference between a TextField and a CharField is negligible with PostgreSQL. I'm relativly new to Django, and was considering using a TextField for variable length urls in my database. I was wondering if there are any advantages to using the URLField? Would it be considered bad form to use a TextField rather than a URLField for urls?

3条回答
看我几分像从前
2楼-- · 2019-03-17 04:01

URLField is actually CharField w/ supporting of Regexp-based URL pattern checking and a online validator(which was replaced by a RegEx based validator), you could use TextField if you don't care length-limitation of URL

from django.core.validators import URLValidator

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

Furthermore, using of CharField or TextField depends on whether you want max-length constraint on the field, and which element type is more suitable for editing: textarea or input. On PostgreSQL side, there is no significant difference.

查看更多
干净又极端
3楼-- · 2019-03-17 04:23

https://docs.djangoproject.com/en/dev/ref/models/fields/#urlfield Of course you can use CharField/TextField but handling user input and be sure whatever user enters is up-to you.

From the source code:

# As with CharField, this will cause URL validation to be performed

If you see the URLField source code you will find it's actually a CharField with URL validator.

Also there is other ready to use fields such as EmailField, ImageField, *Field!

查看更多
\"骚年 ilove
4楼-- · 2019-03-17 04:25

Try this class:

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)
查看更多
登录 后发表回答