web-dev-qa-db-fra.com

Comment définir deux champs "uniques" comme un couple

Est-il possible de définir quelques champs comme uniques dans Django?

J'ai une table de volumes (de journaux) et je ne veux pas plus d'un numéro de volume pour le même journal.

class Volume(models.Model):
    id = models.AutoField(primary_key=True)
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal")
    volume_number = models.CharField('Volume Number', max_length=100)
    comments = models.TextField('Comments', max_length=4000, blank=True)

J'ai essayé de mettre unique = True comme attribut dans les champs journal_id et volume_number, mais cela ne fonctionne pas.

327
Giovanni Di Milia

Il existe une solution simple pour vous appelée nique_together qui fait exactement ce que vous voulez.

Par exemple:

class MyModel(models.Model):
  field1 = models.CharField(max_length=50)
  field2 = models.CharField(max_length=50)

  class Meta:
    unique_together = ('field1', 'field2',)

Et dans votre cas:

class Volume(models.Model):
  id = models.AutoField(primary_key=True)
  journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal")
  volume_number = models.CharField('Volume Number', max_length=100)
  comments = models.TextField('Comments', max_length=4000, blank=True)

  class Meta:
    unique_together = ('journal_id', 'volume_number',)
547
Jens

Django 2.2+

Utilisez UniqueConstraint avec l'option constraints . Il fournit plus de fonctionnalités que unique_together, qui pourrait devenir obsolète dans le futur.

Par exemple:

class Volume(models.Model):
    id = models.AutoField(primary_key=True)
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name="Journal")
    volume_number = models.CharField('Volume Number', max_length=100)
    comments = models.TextField('Comments', max_length=4000, blank=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['journal_id', 'volume_number'], name='name of constraint')
        ]
26
daaawx