检查非可空字段是否为空(Django)

时间:2011-04-20 03:03:23

标签: python django django-models null django-orm

我想写一些这样的代码:

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 :(得分:10)

检查是否设置了属性 -

if hasattr(self, 'field', False)

答案 1 :(得分:0)

在表格中引用字段的正确方法如下:
self.fields['myfield']
所以,在你的情况下,空检查应该像这样 self.fields['myfield'].value is None

另一方面,不要使用保留/接近保留字,例如'field'来命名你的字段。