gpt4 book ai didi

python - 在抽象模型中创建 models.UniqueConstraint

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:16 27 4
gpt4 key购买 nike

我正在为我的 django 应用程序 SrdObject 创建一个抽象模型。我的模型的特征之一是它有一对字段,它们放在一起必须是唯一的:“name”和外键“module”。

这是我的一个例子

class SrdObject(models.Model):
name = models.CharField(max_length=50)
slug_name = models.SlugField(max_length=75, unique=True)
active = models.BooleanField(default=True)
module = models.ForeignKey(Module, on_delete=models.CASCADE, related_name='%(class)s', blank=False, null=False, default='default')

class Meta:
unique_together = ['name', 'module']
ordering = ['name']
abstract = True

这似乎工作正常,但 unique_together 属性已被 django 标记为已弃用(请参阅 here ),因此我将其更改为此

class Meta:
constraints = [
models.UniqueConstraint(fields=['name', 'module'], name='unique-in-module')
]
ordering = ['name']
abstract = True

这不起作用,因为名称字段必须是唯一的,并且由于这是一个抽象类,因此约束在多个模型上重复。

我也尝试过

models.UniqueConstraint(fields=['name', 'module'], name='{}-unique-in-module'.format(model_name))

但显然这会陷入范围问题,所以我尝试了装饰器方法

def add_unique_in_module_constraint(cls):
cls._meta.constraints = [
models.UniqueConstraint(fields=['name', 'module'], name='unique-in-module')
]
return cls

@add_unique_in_module_constraint
class SrdObject(models.Model):
class Meta:
ordering = ['name']
abstract = True

但这似乎没有起到任何作用。

如果每个约束都需要唯一的名称属性,如何在抽象模型中创建 models.UniqueConstraint ?

最佳答案

最新更新

从第三版开始,您终于可以通过 specifying interpolation 做到这一点:

Changed in Django 3.0:
Interpolation of '%(app_label)s' and '%(class)s' was added.

示例:

UniqueConstraint(fields=['room', 'date'], name='%(app_label)s_unique_booking')

旧(Django < 3.0)

你不能这样做,我也遇到同样的问题,太伤心了......

来源:django docs

Constraints in abstract base classes

You must always specify a unique name for the constraint. As such, you cannot normally specify a constraint on an abstract base class, since the Meta.constraints option is inherited by subclasses, with exactly the same values for the attributes (including name) each time. Instead, specify the constraints option on subclasses directly, providing a unique name for each constraint.

关于python - 在抽象模型中创建 models.UniqueConstraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57149015/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com