获取模型的 FK 属性,如果传递了模型



我有以下模型:

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 个问题:

  1. 我有两个手动维护 FK 名称列表
  2. 我需要遍历所有属性,而不是只检查 FK
  3. 我没有使用隐式FK_list来签入,而是建议有一个排除列表(易于维护(: 检查模型上所有非 NULL 或Exclude_list的 FK

您可以使用self._meta.fields获取列的列表。这将生成一个包含字段的元组,值是列定义。

我们可以迭代此列,并检查类型是否为ForeignKey.在这种情况下,我们执行检查:

def clean(self, *args, **kwargs):
# ...
for field in self._meta.fields():
if isinstance(field, ForeignKey):
fk_obj = getattr(self, field.name)
if not fk_obj.active:
raise ValidationError({'is_active': 'The {} {} needs to be active first'
.format(type(fk_obj).__name__, fk_obj.name)})

或者我们可以过滤掉非遗传的:

def clean(self, *args, **kwargs):
# ...
for field in self._meta.get_fields(include_parents=False):
if isinstance(field, ForeignKey):
fk_obj = getattr(self, field.name)
if not fk_obj.active:
raise ValidationError({'is_active': 'The {} {} needs to be active first'
.format(type(fk_obj).__name__, fk_obj.name)})

相关内容

最新更新