如何构造其字段依赖于另一个模型的字段的Django模型

时间:2019-09-19 14:31:44

标签: python django

我目前正在制作一个简单的报纸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文档中有关模型,查询,多对多关系和其他各种属性的页面。我仍然不确定解决方案。

1 个答案:

答案 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')