Question

Django a une propriété unique_for_date vous pouvez définir lors de l'ajout d'un SlugField à votre modèle. Cela provoque la limace être unique que pour la date du champ que vous spécifiez:

class Example(models.Model):
    title = models.CharField()
    slug = models.SlugField(unique_for_date='publish')
    publish = models.DateTimeField()

Quelle serait la meilleure façon d'obtenir le même type de fonctionnalité pour un champ non-DateTime comme un ForeignKey? Idéalement, je veux faire quelque chose comme ceci:

class Example(models.Model):
    title = models.CharField()
    slug = models.SlugField(unique_for='category')
    category = models.ForeignKey(Category)

De cette façon, je pourrais créer les urls suivantes:

/example/category-one/slug
/example/category-two/slug
/example/category-two/slug <--Rejected as duplicate

Mes idées à ce jour:

  • Ajouter un index unique pour la limace et categoryid à la table. Cela nécessite un code extérieur de Django. Et serait correctement l'administrateur poignée intégrée quand l'échec d'insertion / mise à jour?

  • Remplacer la sauvegarde du modèle et d'ajouter ma propre validation, jetant une erreur si une copie existe. Je sais que cela fonctionne, mais il ne semble pas très sec.

  • Créer un nouveau champ slug héritant de la base et ajouter la fonctionnalité unique_for il. Cela semble être la meilleure façon, mais je regardé à travers le code unique_for_date du noyau et il ne semblait pas très intuitive pour l'étendre.

Toutes les idées, suggestions ou opinions sur la meilleure façon de le faire?

Était-ce utile?

La solution

Qu'en est- unique_together ?

class Example(models.Model):
    title = models.CharField()
    slug = models.SlugField(db_index=False)
    category = models.ForeignKey(Category)

    class Meta:
        unique_together = (('slug','category'),)
        # or also working since Django 1.0:
        # unique_together = ('slug','category',)

Cela crée un index, mais il est pas en dehors de Django;) Ou ai-je manqué le point

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top