使用其他模型的数据计算字段-Django

时间:2018-09-20 00:36:32

标签: django python-3.x django-models

我有一个Publications模型和一个Analysis模型。分析模型具有许多字段,可用于对出版物的特征进行评分。然后,可以根据所有分析输入的平均值对出版物进行最终评级(每个出版物可能至少有10个分析条目)。我可以使用注释的平均值来计算视图中的最终评分并将其显示在模板中,但是我希望能够将最终评分(如果可能)保存到出版物模型的字段中(或实际上在db中的任何位置)。

我对使用信号持谨慎态度,因为我仍在学习,并且不断收到警告,以此作为初学者的选择。 @property不起作用,因为我需要能够从数据库访问最终评级。我还尝试通过向save方法添加查询来做到这一点,但这没有用,我也不知道(也找不到任何东西)如何使其工作。

以下是模型:

class Publications(models.Model):
 title = models.CharField(max_length=150, unique=False, blank=False)
 publisher = models.CharField(max_length=250, unique=False)
 publication_date = models.DateField(default=datetime.date.today)
 user = models.ForeignKey(Current_user, related_name="publications")
 final_rating = models.IntegerField(editable=False, default=0)


class Analysis(models.Model):
 title = models.CharField(max_length=150, unique=False, blank=False)
 publications = models.ForeignKey('publication.Publications', on_delete=models.CASCADE, related_name='analysis')

ratings_range = (
(1, 'Very Weak'),
(2, 'Weak'),
(3, 'Moderate'),
(4, 'Strong'),
(5, 'Very Strong'),
)

 content_rating_1 = models.IntegerField(choices=ratings_range)
 content_rating_1_comment = models.TextField(max_length=300)
 content_rating_2 = models.IntegerField(choices=ratings_range)
 content_rating_2_comment = models.TextField(max_length=300)
 content_rating_3 = models.IntegerField(choices=ratings_range)
 content_rating_3_comment = models.TextField(max_length=300)
 content_rating_4 = models.IntegerField(choices=ratings_range)
 content_rating_4_comment = models.TextField(max_length=300)
 content_rating_5 = models.IntegerField(choices=ratings_range)
 content_rating_5_comment = models.TextField(max_length=300)

queryset = super().get_queryset()
    return queryset.filter(
        user__username__iexact=self.kwargs.get("username")
    ).annotate(
    cr1_avg=Avg('analysis__content_rating_1', output_field=IntegerField()),
    cr2_avg=Avg('analysis__content_rating_2', output_field=IntegerField()),
    cr3_avg=Avg('analysis__content_rating_3', output_field=IntegerField()),
    cr4_avg=Avg('analysis__content_rating_4', output_field=IntegerField()),
    cr5_avg=Avg('analysis__content_rating_5', output_field=IntegerField()),

任何帮助或建议都将受到赞赏。

0 个答案:

没有答案