我有一个属于属性的字段,因为它是所有评论的平均值:
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
无法再“检测”该字段。
我有办法同时拥有财产和土地吗?我是否可以创建一个替代字段,使其在每次更改评级时都更新并使其等于该值?
好吧,您不能同时创建字段和属性。此外,我建议不要一开始就使用字段,因为这会导致数据重复:将数据以聚合形式保存在其他位置。事实证明,即使在同一数据库上,数据同步也比看起来要困难得多。
您可以使用annotate(..)
[Django-doc]查询集,以便数据库将自动为其检索的每个项目计算聚合。这样的查询集看起来像:
from django.db.models import Avg
MyModel.objects.annotate(
ratings=Avg('reviews__score')
)
如果您经常需要此值,则可以在模型的Manager
[Django-doc]中执行此操作:
class MyModelManager(models.Manager):
def get_queryset(self):
return super().get_queryset().annotate(
ratings=Avg('reviews__score')
)
class MyModel(models.Model):
# … model without a ratings field
objects = MyModelManager()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句