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

时间:2013-08-26 15:35:48

标签: python django

我正在按照@Yauhen Yakimovich在这个问题中使用的方法:

do properties work on django model fields?

拥有一个计算不同模型的模型字段。

问题:

FieldError: Cannot resolve keyword 'rating' into field. Choices are: _rating

我的rating属性正确隐藏和覆盖了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

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

更新:

我使用order_by()的查询来呼叫ratingorder_by()是在数据库级别,并不知道我的属性。 Soultion,使用Python来排序:

sorted(Restaurant.objects.filter(category=category[0]), key=lambda x: x.rating)[:5]

2 个答案:

答案 0 :(得分:3)

使用sorted()

解决

我使用order_by()查询来调用评级。 order_by()是在数据库级别,并不知道我的属性。 Soultion,使用Python来排序:

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

如果您遇到类似的错误,请查看您可能正在调用该属性的任何内容的视图。属性将不再适用于数据库级别。

答案 1 :(得分:1)

更改此行:

self._rating = Review.objects.filter(restaurant=self.id).aggregate(Avg('rating'))['rating__avg']

进入这一个:

self._rating = Review.objects.filter(restaurant=self.id).aggregate(Avg('_rating'))['_rating__avg']

(注意查询从ratingrating__avg_rating_rating__avg的参考更改)