gpt4 book ai didi

python - 在 1.4 中重写 Model __getattr__ 的适当方法

转载 作者:行者123 更新时间:2023-12-01 06:00:02 25 4
gpt4 key购买 nike

重写 Model 类的正确方法是什么Django 1.4 中的 getattr

我的模型结构如下:

class Main(models.Model):
[blah]

class Detail(models.Model):
main = models.ForeignKey(Main)
name = models.CharField(max_length=255)
value= models.CharField(max_length=255)

我已经覆盖了我的 Main.getattr_ 所以我可以引用详细信息记录就像它们是正常的主要属性一样。例如一个简单的元模型模式如

>>> m = Main.objects.create()
>>> Detail.objects.create(main=m, name='name', value='value')
>>> print m.name
'value'

为此,我的 1.4 之前的 getattr 看起来像:

def __getattr__(self, attrname):
qs = self.details.filter(name=attrname)
c = len(qs)
if c == 0:
raise AttributeError
elif c == 1:
return qs[0].value
else:
return [d.value for d in qs]

在我升级到 1.4 之前,这一切都运行得很好。现在我得到了所有类型“属性 X 不存在”错误。我尝试过类似的东西跟随,但没有运气。好像特别冲突Django 为ForeignKey 引用生成的“_*_cache”属性。

def __getattr__(self, attrname):
try:
return super(Main, self).__getattr__(attrname)
except AttributeError:
pass
qs = self.details.filter(name=attrname)
c = len(qs)
if c == 0:
raise AttributeError
elif c == 1:
return qs[0].value
else:
return [d.value for d in qs]

如何解决这个问题?

最佳答案

仔细研究新的模型代码,后端似乎已经发生了很大的变化,因此 Model 类不再有 __getattr__ 需要重写。相反,我需要调用基本模型继承自的 object.__getattribute__。然而,Django 将缓存数据存储在特殊属性中,需要妥善处理。

我的新 __getattr__ 现在看起来像:

def __getattr__(self, attrname):
try:
return super(Main, self).__getattribute__(attrname)
except AttributeError:
if attrname.startswith('_prefetched'):
raise
qs = self.details.filter(name=attrname)
c = len(qs)
if c == 0:
raise AttributeError
elif c == 1:
return qs[0].value
else:
return [d.value for d in qs]

关于python - 在 1.4 中重写 Model __getattr__ 的适当方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10899082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com