一旦将字段变成Django中的属性,如何防止将字段从模型中“删除”?

问题描述 投票:0回答:1

我有一个属于属性的字段,因为它是所有评论的平均值:

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无法再“检测”该字段。

我是否有办法同时拥有财产和土地?我是否可以创建一个代理字段,使其在每次更改评级时都更新并使其相等?

python django django-models django-filter
1个回答
0
投票

那么,您不能同时使字段和属性同时出现。此外,我建议not首先使用字段,因为这会引入dataduplication:将数据以聚合形式保存在其他地方。事实证明,即使在同一个数据库上,数据同步也比看起来要困难得多。

您可以annotate(..) [Django-doc]查询集,以便数据库将自动<>计算聚合。这样的查询集看起来像:annotate(..)

如果经常需要此值,则可以在模型的from django.db.models import Avg

MyModel.objects.annotate(
    ratings=Avg('reviews__score')
)中执行此操作:

Manager [Django-doc]

© www.soinside.com 2019 - 2024. All rights reserved.