web-dev-qa-db-fra.com

Avantages d'utiliser URLField par rapport à TextField?

Si je comprends bien, vous devez toujours utiliser un TextField pour une chaîne de longueur variable lorsque vous utilisez une base de données PostgreSQL car la différence de vitesse entre un TextField et un CharField est négligeable avec PostgreSQL . Je suis relativement nouveau à Django et envisageais d'utiliser un TextField pour les URL de longueur variable dans ma base de données. Je me demandais s'il y avait des avantages à utiliser le URLField? Serait-il considéré comme une mauvaise forme d'utiliser un TextField plutôt qu'un URLField pour les URL?

40
HighLife

URLField est en fait CharField avec prise en charge de la vérification de modèle d'URL basée sur Regexp et un validateur en ligne (qui a été remplacé par un validateur basé sur RegEx), vous pouvez utiliser TextField si vous ne vous souciez pas de la limitation de la longueur de l'URL

from Django.core.validators import URLValidator

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

En outre, l'utilisation de CharField ou de TextField dépend de si vous souhaitez une contrainte de longueur maximale sur le champ et du type d'élément le plus approprié pour l'édition: zone de texte ou entrée. Côté PostgreSQL, il n'y a pas de différence significative.

61
okm

https://docs.djangoproject.com/en/dev/ref/models/fields/#urlfield Bien sûr, vous pouvez utiliser CharField/TextField mais en gérant les entrées utilisateur et assurez-vous que tout ce que l'utilisateur entre est à jour - à toi.

Du code source:

# Comme avec CharField, cela entraînera la validation de l'URL

Si vous voyez le code source URLField vous constaterez qu'il s'agit en fait d'un CharField avec validateur d'URL.

Il existe également d'autres champs prêts à l'emploi tels que EmailField, ImageField, * Field!

3
Alireza Savand

Essayez cette classe:

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)
2
Vladislav