Django модель (наследование, один ко многим, многие ко многим) - PullRequest
1 голос
/ 17 января 2020

models.py

from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _


class Book(models.Model):

    class TYPE_OF_BOOK(models.TextChoices):
        COMPUTER = 'COM', _('Computer')
        NATURAL_SCIENCE = 'NAT', _('Natual_Science')
        ECONOMY = 'ECO', _('ECONOMY')
        HISTORY = 'HIS', _('History')

    type_of_book = models.CharField(
        max_length=10,
        choices=TYPE_OF_BOOK.choices,
        default=True,
   )

    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    published_date = models.DateField(blank=True)

    def __str__(self):
        return self.title

class Review(models.Model):
   book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='reviews')
    author = models.CharField(max_length=50)
    text = models.TextField()
    grade = models.IntegerField(default=5)
    created_date = models.DateTimeField(default = timezone.now)

    def __str__(self):
        return self.text

На данный момент каждая книга может иметь рецензии.

Как подойти к книге по средней оценке в рецензиях, которые книга имеет.

- дополнительное объяснение -

  1. Я попробовал один-ко-многим и могу получить доступ к book.reviews. Но я не могу подойти к книге по классу

  2. Я пробовал многие ко многим и не могу получить доступ к book.reviews

1 Ответ

0 голосов
/ 17 января 2020

Вы можете .annotate(..) [Django -doc] книг с:

from django.db.models import Avg

Book.objects.annotate(
    <b>rating=Avg('reviews__grade')</b>
)

Book объектами, которые возникают из этот QuerySet будет иметь дополнительный атрибут .rating, который является средним значением grade s связанных *1016* Review объектов. Если связанных обзоров нет, поле будет иметь значение None (не путать с нулем 0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...