我目前正在制作一个简单的报纸Django应用程序,并且正在使用Articles模型,该模型如下所示:
class Article(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
#date = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE,
)
topic = models.CharField(max_length=255)
score_choices = [(-5,'-5'), (-4, '-4'), (-3,'-3'), (-2, '-2'), (-1,'-1'),
(0,'0'),(1,'1'), (2,'2'), (3,'3'), (4,'4'), (5,'5')]
score = models.IntegerField(choices=score_choices, default=0)
我正在尝试创建另一个看起来像这样的模型:
class Topic(models.Model):
topic_name = models.CharField(max_length=255)
average_score =
在主题模型中,我想做的是以某种方式查询所有以topic_name作为主题的文章,然后返回为该主题的文章输入的分数列表。
我目前在这个问题上非常迷茫,我甚至不确定使用Django模型是否是最佳途径。我已经阅读了Django文档以及第三方书籍已有一段时间了,但是我在这里找不到任何参考。
总而言之,我有两个模型:文章和主题。 Article也有一个名为“ topic”的字段,我想为我的Topic类创建一个字段,该字段是其“ topic”字段与我的单独Topic类的字段相同的所有Article对象的score字段的函数。如果这令人困惑,我深表歉意,并且我在尝试自学时并不了解所有术语。
我已经阅读了Django文档中有关模型,查询,多对多关系和其他各种属性的页面。我仍然不确定解决方案。
答案 0 :(得分:1)
使用aggregation可以进行以下操作:
from django.db.models.aggregates import Avg
class Topic(models.Model):
topic_name = models.CharField(max_length=255)
def average_score(self):
return Article.objects.filter(topic=self.topic_name).aggregate(avg=Avg('score')).get('avg')