Django : slug unique et uuid unique
Bonsoir,
Je me demandais, avec Django, j'ai vu qu'il existait des manières pour que slugify génère des slug uniques.
Est-ce qu'il y a une manière vraiment très simple ?
Et pour un UUIDField, apparemment il est presque impossible que deux uuid soient identiques ? Ou il y a moyen de faire en sorte qu'un uuid soit unique dans une app ?
Merci d'avance
Salut !
Slugigy est top. Par contre à ma connaissance, Django ne va pas automatiquement les rendre uniques, il va plutôt te laisser utiliser unique=True si tu veux pour être sûr qu'il soit unique et il enverra une erreur s'il n'est pas unique.
Les UUID sont conçus pour être uniques, deux UUID identiques seraient un phénomène vraiment rarissime.
Encore une fois, si tu veux qu'un UUID soit unique dans ton app, tu peux utiliser "unique=True". Par exemple :
class MonModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)
Ici, l'UUID généré par uuid.uuid4 sera automatiquement unique au sein de ta table.
J'espère que ça réponds à ta question ?
Merci PA.
En gros mon pblm c'est ça.
Imagine un utilisateur appelle un vêtement pantalon noir.
Puis un autre appel ça aussi pantalon noir il aura une erreur.
Je me demandais s'il y avait quelque chose de conventionnel avec django pour palier à ce probleme.
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.description)
super().save(*args, **kwargs)
Salut Gab !
Si ta problématique c'est de par exemple identifier deux éléments dans une vue, alors utilise le pk ! Là tu seras sûr que dans ta BDD il n'y en a pas deux identiques puisque c'est le champ par défaut qui est utilisé en unique.
Le slug c'est bien surtout pour les URL, par exemple pour un article de blog (c'est plus clair d'avoir une URL du style /blog/python-vs-javascript/ plutôt que /blog/1/). Mais dès que tu veux récupérer un élément en t'assurant qu'il est unique, utilise le pk :)
Salut THibault,
en fait c'est un autre problème.
Pour le problème dont tu parles j'utilises toujours le PK oui.
Mais en fait c'est que le slug se créer tout seul dans save avec slugify de la description du vêtement.
Même si unique=True, il suffit que deux utilisateurs utilisent la mm description, et là erreur. Et pour palier à ce problème j'ai regardé sur internet les ressources datent un peu.
En général quand j'utilise slugify dans une app ça ne pose pas de problème, car c'est moi qui gère la création d'une instance. C'est que là je n'ai pas le contrôle, n'importe quel utilisateur peut créer un article et potentiellement se retrouver avec une erreur unique constraint...
Le mieux c'est que je vais virer le slug, et faire comme d'hab passer par le pk.
Si c'est bon on peut clôturer ^^
Merci ! :)
Si tu as mis ton slug comme unique dans ton modèle, alors oui ça pose problème, mais pourquoi le mettre en unique ?
Tu peux décider d'enlever la contrainte unique, et deux utilisateurs peuvent créer un article avec le slug "pantalon-noir" par exemple. Le seul problème que cela peut poser (et ça fait écho à ma réponse précédente), c'est si tu te bases sur le slug pour l'URL : si dans l'URL tu as /article/pantalon-noir/, tu vas te retrouver avec deux instances (ou plus) qui peuvent correspondre et tu ne sauras pas quel article afficher.
Donc les questions à se poser :
-
Quelle est l'utilité / le but d'avoir un slug ?
-
Pourquoi devrait-il être unique ?
Si tu veux utiliser le slug dans l'URL, tu peux le combiner avec le pk ou ton UUID. Ça permet d'avoir une URL intelligible et d'utiliser le PK pour récupérer ton instance.
C'est ce que je fais pour les vidéos sur Docstring ;)
https://www.docstring.fr/formations/gerer-des-chemins-avec-pathlib/le-probleme-avec-les-chemins-1301/
👉 le-probleme-avec-les-chemins-1301
slug-pk
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte