我有一个带有自定义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')。我正在摸索着如何做到这一点。
self
是User
个实例,因此应始终reporting_period
。当某个字段无法作为属性访问时,Django中的模型实例的生命周期中是否有任何时间?
不幸的是,这个问题只发生在我无法调试的生产环境中。
答案 0 :(得分:1)
在调用__init__
类的Model
方法之前,不会定义实例上的字段属性。在调用super方法之前尝试访问自定义__init__
方法中的字段属性将导致AttributeError
。
否则必须意外删除实例上的属性。
我认为,在模型实例上未定义字段属性时,这是唯一的两个实例。
编辑:我做了一个小测试,并且unpickling保留了模型原始版本的属性,但新方法延续到重新创建的模型。因此,您可以调用新的get_reporting_period
函数,但在尝试访问未定义的AttributeError
属性时会引发reporting_period
。
这意味着在这种情况下,您应该在添加新字段后使缓存的条目无效。但是,有很多序列化方法不会导致这样的错误。看一下this question的答案,找出一种没有这个问题的序列化模型的方法。