我有一个属于属性的字段,因为它是所有评论的平均值:
ratings = models.FloatField(null=True, default=0)
@property
def ratings(self):
return self.reviews.aggregate(avg_score=Avg('score'))['avg_score']
问题是,如果执行此操作,则该字段“消失”。实际上,如果我运行makemigrations
,它将删除该字段。问题是我使用django-filter
,并且我希望可以选择按等级过滤(向我显示所有7到10之间的书)。如果我将其设置为属性,则将无法执行此操作,因为django-filter
无法再“检测”该字段。
我是否有办法同时拥有财产和土地?我是否可以创建一个代理字段,使其在每次更改评级时都更新并使其相等?
那么,您不能同时使字段和属性同时出现。此外,我建议not首先使用字段,因为这会引入dataduplication:将数据以聚合形式保存在其他地方。事实证明,即使在同一个数据库上,数据同步也比看起来要困难得多。
您可以annotate(..)
[Django-doc]查询集,以便数据库将自动<>计算聚合。这样的查询集看起来像:annotate(..)
如果经常需要此值,则可以在模型的from django.db.models import Avg
MyModel.objects.annotate(
ratings=Avg('reviews__score')
)
中执行此操作: