Comment créer une limace unique_for_field dans Django?
-
24-09-2019 - |
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?
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