作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
重写 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/
这段代码在 Java 中的等价物是什么?我放了一部分,我对 I/O 部分感兴趣: int fd = open(FILE_NAME, O_WRONLY); int ret = 0; if (fd =
我正在尝试将维度为 d1,d2,d3 的张量 M[a1,a2,a3] reshape 为维度为 d2, d1*d3 的矩阵 M[a2,a1*a3]。我试过 M.reshape(d2,d1*d3) 但是
我是一名优秀的程序员,十分优秀!