【发布时间】:2018-09-01 09:52:31
【问题描述】:
我有以下型号:
class Comp(models.Model):
....
is_active = models.BooleanField(default=False)
class Item(models.Model):
comp = models.ForeignKey(Comp, blank=True, null=True, related_name='items', on_delete=models.CASCADE)
romp = models.ForeignKey(Romp, blank=True, null=True, related_name='items', on_delete=models.CASCADE)
is_active = models.BooleanField(default=False)
我想编写一个通用模型clean 方法来检查模型的non Null 外键,如果他们的is_active=True
我想在多个模型上继承这个方法(使用抽象模型)
在下面的代码中,我通过 FK 的一般列表检查每个模型属性
def clean(self, *args, **kwargs):
....
for attr in FK_LIST:
if hasattr(self, attr):
fk_obj = getattr(self, attr)
if not fk_obj.active:
raise ValidationError({'is_active': 'The {} {} needs to be active first'
.format(type(fk_obj).__name__, fk_obj.name)})
我的代码有 2 个问题:
- 我有两个手动维护一个 FK 名称列表
- 我需要循环遍历所有属性,而不是只检查 FK
- 我不希望有一个隐式的 FK_list 来签入,而是有一个排除列表(易于维护): 检查模型上所有非 NULL 或 Exclude_list 中的 FK
【问题讨论】:
-
只有外键?我也假设
OneToOneFields?ManyToManyFields 或OneToMany等其他关系呢? -
只是FK,OnetoOne,我喜欢层次关系,所以如果父母不活动,我只是不想激活孩子
-
@use3541631:如果你定义了
OneToOneField,django 会自动在引用的模型中创建一个反向字段。
标签: django django-models