Python Django@property计算模型字段:FieldError:无法解析关键字

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

我遵循@Yauhen Yakimovich在这个问题上使用的方法:

要使模型字段是另一个模型的计算,请执行以下操作

问题是:
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
,但您需要将其更改回fix
FieldError
?好吧,将您的属性视为一个函数(因为它是一个getter,在Java中它将被称为
getRating()
)。还有一列存储该计算的结果。可以基于列执行查询,但不能基于Python函数执行查询(至少不能在数据库级别)。你能举一些你尝试过的例子和结果吗?
sorted(Restaurant.objects.filter(category=category[0]), key=lambda x: x.rating, reverse=True)[:5]