我正在按照@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()
的查询来呼叫rating
。 order_by()
是在数据库级别,并不知道我的属性。 Soultion,使用Python来排序:
sorted(Restaurant.objects.filter(category=category[0]), key=lambda x: x.rating)[:5]
答案 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']
(注意查询从rating
和rating__avg
到_rating
和_rating__avg
的参考更改)