检查非空字段是否为null

3 投票
2 回答
5336 浏览
提问于 2025-04-16 16:05

我想写一些这样的代码:

class SomeModel(models.Model):
    
    field = models.ForeignKey(SomeOtherModel)

    def __init__(self, *args, **kwargs):
        super(SomeModel, self).__init__(*args, **kwargs)
        if self.field is None:
            self.field = SomeOtherModel()

    ...

但是这会引发一个错误:self.field.rel.to.DoesNotExist。Django的代码对此是非常明确的:

class ReverseSingleRelatedObjectDescriptor(object):

    def __get__(self, instance, instance_type=None):

        ...

        if val is None:
            # If NULL is an allowed value, return it.
            if self.field.null:
                return None
            raise self.field.rel.to.DoesNotExist

一个明显的解决办法是把这个字段设置为可为空,不过据我了解,这样做会影响数据库的结构。而且我还挺喜欢Django提供的完整性检查。另一个办法是捕获这个错误并妥善处理,但这样会增加很多重复的代码。特别是当有多个这样的字段时(每个字段都要写一个单独的try...except块——这看起来就很糟糕)。我该怎么办呢?

我可以使用initial,但在处理外键时,这个方法相对有限。我并不总是知道在创建时想要的默认值是什么。不过在初始化阶段我会知道。此外,这个默认值可能还会依赖于其他字段的值。

2 个回答

0

在表单中正确引用一个字段的方法是这样的:
self.fields['myfield']
所以,在你的情况下,检查这个字段是否为空应该这样写:
self.fields['myfield'].value is None

另外,尽量不要用像'field'这样的保留字或者接近保留字的词来命名你的字段。

10

检查它是否设置了这个属性 -

if hasattr(self, 'field')

撰写回答