Набор запросов Django комментирует вычисленные значения из другой модели - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть 4 модели в иерархии: анализ, книги, категории и издатель.В моем приложении вы анализируете книги.Книги относятся к категориям, где вы можете просмотреть средний рейтинг анализа всех книг в категории.Этот средний рейтинг (который я называю avg-catg-rating) не сохраняется в дБ, он рассчитывается в представлении.

Вот мой вопрос: как получить средний рейтинг категории для каждой категории, которую издательна один вид издателя?Другими словами, как мне аннотировать avg-catg-rating для каждой категории, чтобы я мог отобразить их все на странице издателя?

Итак, я повторяю, используя категорию как-то так вопрос ?Если да, пожалуйста, дайте совет о том, как, потому что я не совсем уверен, как это сделать.Я также попробовал групповой режим, как предложено в этом разделе , но я мог получить только количество экземпляров книги, я не мог точно комментировать 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

class Издатель: title = models.CharField (max_length = 150, unique = False, пробел = 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 голосов
/ 10 декабря 2018

Я отпустил свою одержимость делать все в представлении.

Решение состоит в том, чтобы создать метод в ваших моделях, который вы можете вызвать в шаблоне.В моем случае я создал метод в 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>
...