Django “如何定义两个字段”;独特的;作为夫妻

Django “如何定义两个字段”;独特的;作为夫妻,django,django-models,Django,Django Models,在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 = model

在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\u id
volume\u number
字段中,但它不起作用。

有一个简单的解决方案,可以满足您的需求

例如:

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',)
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')
        ]
在您的情况下:

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',)
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')
        ]
Django 2.2+ 与一起使用独特功能相比,最好使用这些功能

从Django文档中获取:

将UniqueConstraint与约束选项一起使用。
UniqueConstraint提供的功能比UniqueConstraint多。
unique_在将来可能会被弃用

例如:

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

我想你会得到一个“ValidationError”异常。看看Django文档:Model.validate\u unique如果卷号可以为空,您将如何处理这个问题?Mysql在这种情况下似乎不会强制执行unique。仅供参考,如果您尝试添加重复项,它会抛出一个django.db.utils.IntegrityError。@Greg-根据ANSI标准SQL:2003(以及以前的标准),一个
unique
约束应该不允许重复的非
NULL
值,但允许多个
NULL
值(参见草稿,框架,第22页)。如果您希望您的唯一约束不允许多个空值,您可能做了一些错误的事情,例如使用
null
作为有意义的完整值。请记住,可空字段表示“我们并不总是为该字段设置值,但当我们这样做时,它必须是唯一的。”。那么多个
unique\u-together
约束呢?例如,当我希望模式列在父级范围内是唯一的时?这个属性实际上是一个元组本身,请参见:因此您的约束应该更明确地写为:
unique\u-together=('journal\u-id','volume\u-number',),)
。在什么情况下会使用UniqueConstraint的“name”参数?我假设它的工作原理与URL路径的name参数类似?@user7733611命名约束在许多情况下都会很有用。例如,如果您连接到旧数据库,或者如果您只想让约束名称更易于人类阅读数据库。有一次我迁移了一个MySQL数据库的字符集,Django生成的约束名称对于我们的特定目标来说实际上太长了。不是100%确定它来自
UniqueConstraint
,但我得到了奇怪的
psycopg2.errors.DuplicateTable:relation“name\u of the\u the\u constraint”已经存在
当我切换到PostgresIt时,应该注意像
CharField
这样的文本字段可能区分大小写,也可能不区分大小写,具体取决于您的数据库配置!