Résolue

Django : slug unique et uuid unique

# Bases de données # Django

Gabriel Trouvé

Mentor

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 ?

Gabriel Trouvé

Mentor

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)

Thibault houdon

Mentor

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 :)

Gabriel Trouvé

Mentor

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 ?

Gabriel Trouvé

Mentor

oui c'est pour ca que je vais repartir comme j'ai fait au début du projet,
je vais utiliser le pk dans l'url au moins j'évite tout problème.

merci Thibault !

Thibault houdon

Mentor

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

Gabriel Trouvé

Mentor

mais oui !

je vais faire ça, utiliser le pk et le slug et je vais enlever le parametre unique.

j'avais mal exprimer mon besoin. une Url intelligible.

je vais combiner les 2, c'est vrai que je ne l'ai jamais fait

:) merci Thibault !

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.