【问题标题】:Django QuerySet API check if is unique for this idDjango QuerySet API 检查此 id 是否唯一
【发布时间】:2021-02-19 02:34:09
【问题描述】:

这是我的模型的样子:

class Catalog(models.Model):
    global_id = models.IntegerField(unique=True)
    name = models.CharField(max_length=30)
    short_name = models.CharField(max_length=10)
    description = models.CharField(max_length=200, blank=True)
    version = models.CharField(max_length=10)

    class Meta:
        constraints = [
            models.CheckConstraint(
                check=models.Q(
                //
                CHECK IF VERSION IS UNIQUE FOR THIS PARTICULAR GLOBAL_ID
                //
                ),
                name="%(app_label)s_%(class)s_unique_version",
            )
        ]

如您所见,我需要确保版本模型对于特定的 global_id 是唯一的,我只是不知道怎么做。帮助。

【问题讨论】:

  • 你的 django 版本是多少?

标签: django django-models django-queryset


【解决方案1】:

根据the docs,您可以使用 django 3.1 的“唯一”选项:

如果为 True,则此字段在整个表中必须是唯一的。

这是在数据库级别和模型验证中强制执行的。如果你 尝试在唯一字段中保存具有重复值的模型,a django.db.IntegrityError 将由模型的 save() 方法引发。

这会让你的声明变成这样:

version = models.CharField(max_length=10, unique=True)

【讨论】:

    【解决方案2】:

    下面的代码允许您针对这两个字段设置唯一约束。 请注意,此操作的唯一约束已从 global_id 字段中删除。

    class Catalog(models.Model):
        global_id = models.IntegerField(max_length=10)
        version = models.CharField(max_length=10)
    
        class Meta:
            constraints = [
                models.UniqueConstraint(
                    fields=['global_id', 'version'],
                    name='unique_global_id_for_version'
                )
            ]
    
    >>> Catalog.objects.create(global_id=80, version=80)
    <Catalog: Catalog object (10)>
    >>> Catalog.objects.create(global_id=90, version=80)
    <Catalog: Catalog object (11)>
    >>> Catalog.objects.create(global_id=80, version=80)
    django.db.utils.IntegrityError: UNIQUE constraint failed: ...
    >>> Catalog.objects.create(global_id=80, version=90)
    <Catalog: Catalog object (12)>
    

    上面,当尝试使用global_id=80 创建目录时失败,因为它已经存在于version=80,但后来能够为version=90 的目录创建带有global_id=80 的目录。

    The docs for this constraint

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2016-01-15
      • 2021-09-21
      相关资源
      最近更新 更多