Django queryset注释来自另一个模型的计算值

时间:2018-12-07 16:36:46

标签: django django-views

我在一个层次结构中有4个模型:分析,书籍,类别和发布者。在我的应用程序中,您可以分析书籍。书籍属于类别,您可以在其中查看类别中所有书籍的平均分析评分。该平均评分(我称为avg-catg-rating)未存储在dB中,而是在视图中计算得出的。

我的问题是:如何在单个发布者视图中获得发布者拥有的每个类别的平均类别评分?换句话说,我该如何在每个类别上注释avg-catg-rating,以便将其全部显示在发布商页面上?

那么我是否可以像这样question迭代使用类别?如果是,请给一个提示,因为我不太确定该怎么做。我也按照this chap的建议尝试了groupby,但是我只能获得书本实例的数量,而我无法准确地注释avg-catg-rating。

要澄清:

Models.py:

class Analysis: 
    title = models.CharField
    content_rating_1 = models.IntegerField(blank=True,
    null=True, default="0")
    content_rating_1_comment = models.TextField(max_length=300, blank=True,
    null=True)
    source_rating_1 = models.IntegerField(blank=True,
    null=True, default="0")
    source_rating_1_comment = models.TextField(max_length=300, blank=True,
    null=True)
    book = models.ForeignKey

class Book:
    publication_date = models.DateField(default=datetime.date.today)
    slug = models.SlugField(allow_unicode=True, unique=False, max_length=160)
    category = models.ForeignKey

class Category:
    title = models.CharField(max_length=150, unique=False, blank=False)
    sub_title = models.CharField(max_length=100, blank=True, null=True)
    publisher = models.ForeignKey

类发布者:         title = models.CharField(max_length = 150,unique = False,blank = False)

publisher / views.py:

class ViewPublisher:

def get_context_data(self, **kwargs):
        category_qs = Category.objects.filter(publisher__pk=self.kwargs['pk'])
        avg-catg-rating = Books.objects.annotate(long complex queryset that uses values from the analysis model)
        context = super(ViewPublisher, self).get_context_data(**kwargs)
        context['categories'] = category_qs
        context['category_stats'] = Books.objects.filter(category__pk__in=category_qs)\
        .annotate(.....and now what???)

1 个答案:

答案 0 :(得分:0)

我放弃了对视图中所有内容的迷恋。

解决方案是在模型中创建一个可以在模板中调用的方法。就我而言,我在Category / models.py中创建了一个方法,如下所示:

class Category:
    title = models.CharField(max_length=150, unique=False, blank=False)
    sub_title = models.CharField(max_length=100, blank=True, null=True)
    publisher = models.ForeignKey

    def sum_catg_avg_rating(self):
    scar = self.books.annotate(avg-catg-rating=(annotate the AVG calculations from the 
    analysis))

    return scar

然后将类别包括在发布者的上下文中:

class ViewPublisher:

def get_context_data(self, **kwargs):
        category_qs = Category.objects.filter(publisher__pk=self.kwargs['pk'])
        context = super(ViewPublisher, self).get_context_data(**kwargs)
        context['categories'] = category_qs

        return context

现在,我可以在模板中调用它:

{% for catg in categories %}
<h5>{{ catg.title }}</h5>
<p> RATING:<i>{{ catg.sum_catg_avg_rating.avg-catg-rating }}</i></p>