Python Django@property计算模型字段:FieldError:无法解析关键字
我遵循@Yauhen Yakimovich在这个问题上使用的方法: 要使模型字段是另一个模型的计算,请执行以下操作 问题是:Python Django@property计算模型字段:FieldError:无法解析关键字,python,django,Python,Django,我遵循@Yauhen Yakimovich在这个问题上使用的方法: 要使模型字段是另一个模型的计算,请执行以下操作 问题是: ratingmodel字段inst被我的rating属性正确隐藏和覆盖,在我尝试访问它时导致错误 我的模型: class Restaurant(models.Model): ... ... @property def rating(self): from django.db.models import Avg
rating
model字段inst被我的rating
属性正确隐藏和覆盖,在我尝试访问它时导致错误
我的模型:
class Restaurant(models.Model):
...
...
@property
def rating(self):
from django.db.models import Avg
return Review.objects.filter(restaurant=self.id).aggregate(Avg('rating'))['rating__avg']
Yauhen回答中的模型:
class MyModel(models.Model):
__foo = models.CharField(max_length = 20, db_column='foo')
bar = models.CharField(max_length = 20)
@property
def foo(self):
if self.bar:
return self.bar
else:
return self.__foo
@foo.setter
def foo(self, value):
self.__foo = value
关于如何正确隐藏评级
字段并定义@属性
技术,您有什么想法吗?更改此行:
self.\u rating=Review.objects.filter(restaurant=self.id).aggregate(平均('rating'))['rating\uu Avg']
在这一点上:
self.\u rating=Review.objects.filter(restaurant=self.id).aggregate(平均值)(“平均值”)[“平均值”]
(注意查询中的参考从
评级
和评级平均值
更改为评级
和评级平均值
)使用排序()解决
我使用order_by()查询来调用rating。order_by()位于数据库级别,不知道我的属性。因此,请使用Python进行排序:
sorted(Restaurant.objects.filter(category=category[0]), key=lambda x: x.rating, reverse=True)[:5]
如果遇到类似错误,请在视图中检查可能调用该属性的任何内容。属性将不再在datatbase级别工作。您正在尝试在getter中设置值。请看您发布的示例。您需要提供一个getter(修饰为@property
)和一个单独的setter(修饰为@rating.setter
)。@BrenBarn您的意思是什么?我相信我不是在尝试实现设置功能,只是想实现get。例如,我只想能够调用r.rating
并返回平均值。我从不想把r.rating
设置为某种东西。我知道我是在初始的@property
方法中设置的,但在遵循此方法以及其他使用相同策略的方法之后,这似乎是正确的。另外,为什么会出现字段错误
?您在原始问题中链接到的问题是“属性不能在QuerySet中使用”,这意味着您可能无法使用Avg('rating')
@BrenBarn:不可能,但可以肯定。属性就在模型实例中,而本例中的查询集只取字段/列名。@Tadeck:我之所以说“可能”,是因为我对Django了解不够,不知道它在做什么:-)我使用了您的解决方案来消除字段错误
,但一旦调用属性,它就会立即返回。例如:Restaurant.objects.filter(category=category[0]).order\u by(“评级”)[:5]
只返回无类型,并强制我将@proprety Avg(“评级”)[“评级”\uu Avg]更改为Avg(“评级”)[“评级”[uu Avg],以避免字段错误。我是否正确地询问财产?我不确定我是否遵守了。您是说将代码从您的版本更改为我的版本修复了FieldError
,但您需要将其更改回fixFieldError
?好吧,将您的属性视为一个函数(因为它是一个getter,在Java中它将被称为getRating()
)。还有一列存储该计算的结果。可以基于列执行查询,但不能基于Python函数执行查询(至少不能在数据库级别)。你能举一些你尝试过的例子和结果吗?
sorted(Restaurant.objects.filter(category=category[0]), key=lambda x: x.rating, reverse=True)[:5]