【发布时间】:2019-11-30 14:33:04
【问题描述】:
我正在为我的 django 应用程序创建一个抽象模型,SrdObject。我的模型的一个特点是它有一对字段,它们加在一起必须是唯一的:“名称”和外键“模块”。
这是我的一个例子
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
这不起作用,因为 name 字段必须是唯一的,并且由于这是一个抽象类,因此约束会在多个模型上重复。
我也试过
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?
【问题讨论】:
-
只是为了澄清-名称/模块的唯一性是跨从 SrdObject 继承的所有模型? IE。假设我们有两个模型 - SrdObjectA 和 SrdObjectB - 从 SrdObject 继承,如果我有一个名为“test”且模块 id 为 1 的 SrdObjectA,那么我也不能有一个名为“test”和模块 id 的 SrdObject 1 个?
-
这不是必需的。每个 SrdObject 模型都有自己的命名空间
标签: python django python-3.x django-models