我有一个像这样的模型:
self.init(frame:frame)
我添加了 location 属性。 我在运行时遇到此错误。我只粘贴了最近一次调用的部分,在这种情况下是len()(我知道,改为使用 count )。
UILabel
我无法弄清楚为什么会出错?如果我将其称为 locationx ,那么就没有错误。
Django是否有一些特殊的属性定义规则?
我该怎么调试呢?
我添加了属性,因为我添加了 test 间接,并希望尽可能少地更改代码。当然,我可以将每个class MyReport(models.Model):
group_id = models.PositiveIntegerField(blank=False, null=False)
test = models.ForeignKey(Test, on_delete=models.CASCADE)
owner = models.ForeignKey(User, editable=False, default=get_current_user, on_delete=models.CASCADE)
user_objects = UserFilterManager()
@property
def location(self):
return self.test.location
更改为 File "C:\Python27\Lib\site-packages\django\db\models\query.py", line 240, in __len__
self._fetch_all()
File "C:\Python27\Lib\site-packages\django\db\models\query.py", line 1074, in _fetch_all
self._result_cache = list(self.iterator())
File "C:\Python27\Lib\site-packages\django\db\models\query.py", line 75, in __iter__
setattr(obj, attr_name, row[col_pos])
AttributeError: can't set attribute
,但这会令人讨厌。如果我可以为数据库搜索定义别名,那将是很好的,所以我需要更改它们。
编辑:回答评论:
report.location
而不是添加间接report.test.location
(不想更改位置在报表模型中的现有代码)。report.location
和report.test.location
工作,self.test.location
也有效。report.test.location
。 以下是Eclipse控制台的完整跟踪:
reports.locationx
答案 0 :(得分:14)
问题是名字冲突。
显然在查询数据库时我有:
objs = MyReport.objects.annotate(location=F('test__location'))
这为对象添加了location
(在__dict__
中没有看到它,但也许我只是错过了它)。这意味着我可以放弃这个属性,因为我可以打电话给report_instance.location
。当然,这意味着访问MyReport的所有地方都需要添加注释(特殊管理器?)。
答案 1 :(得分:0)
尝试确保设置test
:
@property
def location(self):
return self.test.location if self.test else None
答案 2 :(得分:0)
我有同样的问题。我解决了
@location.setter
def location(self, val):
pass
答案 3 :(得分:0)
刚刚遇到了一个类似的问题,似乎通过确保我没有使用与我试图调用的属性同名的别名进行注释来解决。