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?
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.
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!
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)