具有已定义字段的模型在访问时会引发AttributeError

时间:2014-04-14 09:16:34

标签: django django-models

我有一个带有自定义User模型的Django 1.5应用。它有以下字段(在众多其他字段中):

class User(models.Model):
    ...

    reporting_period = models.CharField(
        max_length=20,
        choices=REPORTING_PERIODS,
        null=True,
        blank=True,
        default=None
    )

    company = models.ForeignKey(
        Company,
        null=True,
        blank=True,
        default=None
    )

此模型还定义了以下功能:

def get_reporting_period(self, company_reporting_period=None):
    if not self.reporting_period:
        if not hasattr(self, '_company_reporting_period'):
            if company_reporting_period:
                self._company_reporting_period = company_reporting_period
            else:
                self._company_reporting_period = self.company.reporting_period
        return self._company_reporting_period
    else:
        return self.reporting_period

有时,get_reporting_period函数会在行if not self.reporting_period:上抛出AttributeError('User'对象没有属性'reporting_period')。我正在摸索着如何做到这一点。

selfUser个实例,因此应始终reporting_period。当某个字段无法作为属性访问时,Django中的模型实例的生命周期中是否有任何时间?

不幸的是,这个问题只发生在我无法调试的生产环境中。

1 个答案:

答案 0 :(得分:1)

在调用__init__类的Model方法之前,不会定义实例上的字段属性。在调用super方法之前尝试访问自定义__init__方法中的字段属性将导致AttributeError

否则必须意外删除实例上的属性。

我认为,在模型实例上未定义字段属性时,这是唯一的两个实例。

编辑:我做了一个小测试,并且unpickling保留了模型原始版本的属性,但新方法延续到重新创建的模型。因此,您可以调用新的get_reporting_period函数,但在尝试访问未定义的AttributeError属性时会引发reporting_period

这意味着在这种情况下,您应该在添加新字段后使缓存的条目无效。但是,有很多序列化方法不会导致这样的错误。看一下this question的答案,找出一种没有这个问题的序列化模型的方法。