Как определить два поля "уникальные" как пара - PullRequest
315 голосов
/ 04 февраля 2010

Есть ли способ определить пару полей как уникальных в Django?

У меня есть таблица томов (журналов), и я не хочу больше одного номера тома для одного журнала.

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)

Я пытался указать unique = True как атрибут в полях journal_id и volume_number, но он не работает.

Ответы [ 2 ]

538 голосов
/ 04 февраля 2010

Для вас есть простое решение под названием unique_together , которое делает именно то, что вы хотите.

Например:

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

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

А в вашем случае:

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',)
11 голосов
/ 22 апреля 2019

Джанго 2,2 +

Используйте UniqueConstraint с опцией constraints. Он обеспечивает больше функциональных возможностей, чем unique_together, что может быть исключено в будущем.

Например:

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')
        ]
...