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

agc*_*nti 5 python django

我正在使用@Yauhen Yakimovich在此问题中使用的方法:

属性对Django模型字段有效吗?

具有模型字段,该模型字段是对不同模型的计算。

问题:

FieldError: Cannot resolve keyword 'rating' into field. Choices are: _rating
Run Code Online (Sandbox Code Playgroud)

当我尝试访问它时,rating模型字段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']
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

关于如何正确隐藏rating字段和定义@property技术的任何想法?

更新:

我正在使用查询order_by()来呼叫ratingorder_by()在数据库级别,并且不了解我的财产。灵魂,请使用Python进行排序:

sorted(Restaurant.objects.filter(category=category[0]), key=lambda x: x.rating)[:5]
Run Code Online (Sandbox Code Playgroud)

agc*_*nti 4

通过使用解决sorted()

我使用 order_by() 的查询来调用评级。order_by() 位于数据库级别,不知道我的属性。好吧,改用Python来排序:

sorted(Restaurant.objects.filter(category=category[0]), key=lambda x: x.rating, reverse=True)[:5]
Run Code Online (Sandbox Code Playgroud)

如果您遇到类似的错误,请通过视图检查是否有任何可能调用该属性的内容。属性将不再在数据库级别起作用。