Question Créer des index partiels avec Django 1.7


le Documentation pour Django 1.7 mentions RunSQL Les classes peuvent être utilisées pour créer des index partiels sur vos tables. J'ai une table où je veux la combinaison de title, blog Et category être unique. Cependant, si la catégorie n'est pas fournie, la combinaison du titre et du blog devrait toujours être unique.

class Post(models.Model):
    title = models.CharField(max_length=200)
    blog = models.ForeignKey(Blog)
    category = models.ForeignKey(Category, null=True, blank=True)

Je peux réaliser cette contrainte avec des index partiels (comme le SQL ci-dessous). Où puis-je ajouter ce code si j'utilise les migrations Django 1.7?

CREATE UNIQUE INDEX idx1 
  ON Post (title, blog_id, category_id) 
  WHERE category_id IS NOT NULL;

CREATE UNIQUE INDEX idx2 
  ON Post (title, blog_id)
  WHERE category_id IS NULL;

10
2017-10-16 17:32


origine


Réponses:


Commencez par créer un nouveau fichier de migration vide:

python manage.py makemigrations --empty yourappname

Ensuite, pour chaque index, ajoutez un RunSQL ligne:

operations = [
    migrations.RunSQL("CREATE UNIQUE INDEX..."),
]

Enfin, courez migrate.


18
2017-10-16 19:14



Vous pourriez juste fournir un unique_together ainsi:

class Post(models.Model):
    title = models.CharField(max_length=200)
    blog = models.ForeignKey(Blog)
    category = models.ForeignKey(Category, null=True, blank=True)

class Meta:
    unique_together = ("title", "blog", "category")

NULL pour la catégorie fonctionnera comme vous le voulez dans la mesure où, s'il n'est pas défini, le titre / blog doit être unique.

https://docs.djangoproject.com/en/1.8/ref/models/options/#unique-together 


0
2017-11-27 10:52