Как определить два поля "уникальный" как пара
Есть ли способ определить пару полей как уникальных в 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
, но он не работает.
Ответы
Ответ 1
Существует простое решение для 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',)
Ответ 2
Джанго 2. 2+
UniqueConstraint
используйте 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')
]