Python 为什么是Django';s相关的_模型属性是否返回字符串而不是模型实例?

Python 为什么是Django';s相关的_模型属性是否返回字符串而不是模型实例?,python,django,django-admin,django-jet,Python,Django,Django Admin,Django Jet,我有一些奇怪的行为,至少对我来说,这导致了我的项目中的一些错误 我正在使用Django 1.9和一个第三方Django包(),该包使用Django admin中的field.related_model属性,有时它会失败,因为它需要field。related_model返回一个模型实例,对于我的一些模型,它会返回模型名称 我尝试过的事情: 如果Django的相关_模型是@property而不是@cached_属性,那么它将工作并返回模型实例 如果我在导致错误的行中调用field.remote\

我有一些奇怪的行为,至少对我来说,这导致了我的项目中的一些错误

我正在使用Django 1.9和一个第三方Django包(),该包使用Django admin中的
field.related_model
属性,有时它会失败,因为它需要
field。related_model
返回一个模型实例,对于我的一些模型,它会返回模型名称

我尝试过的事情:

  • 如果Django的相关_模型是@property而不是@cached_属性,那么它将工作并返回模型实例
  • 如果我在导致错误的行中调用
    field.remote\u field.model
    而不是
    field.related\u model
    ,它将工作并返回模型实例
拜托,你知道吗?我可以解决这个问题,但我想知道为什么会有这种行为


提前谢谢

我认为这里出现的问题是因为jet试图在
RelatedFieldAjaxListFilter.field\u choices()
方法中使用
related\u model
,这可能会在加载所有应用程序之前执行。如果我理解正确,
related_model
值最初是一个字符串,在模型初始化过程中被模型对象替换。如果您试图在应用程序全部加载之前获取该值,则可能会获取字符串或对象,具体取决于加载模型的顺序。而且,由于它是一个缓存属性,因此在该阶段获取字符串值将导致字符串值被缓存。例如,请参见
django.db.models.options
中的注释

# The mechanism for getting at the related model is slightly odd -
# ideally, we'd just ask for field.related_model. However, related_model
# is a cached property, and all the models haven't been loaded yet, so
# we need to make sure we don't cache a string reference.
通过使
related\u name
成为未缓存的属性,可以避免该问题

django.contrib.admin.filters.RelatedFieldListFilter
code中,它们不使用
related\u model
来获取模型对象,而是使用一个实用函数,
django.contrib.admin.utils.get\u model\u from\u relation()
RelatedFieldAjaxListFilter.field_choices()
可能也在执行类似的操作

# The mechanism for getting at the related model is slightly odd -
# ideally, we'd just ask for field.related_model. However, related_model
# is a cached property, and all the models haven't been loaded yet, so
# we need to make sure we don't cache a string reference.