В Django как вы получаете количество записей в сквозной таблице, которые относятся к объекту? - PullRequest
0 голосов
/ 23 марта 2020

Как вы получаете количество записей в таблице через сквозную таблицу, которые связаны в обратном направлении?

РЕДАКТИРОВАТЬ: я упростил модели.

Как узнать, сколько раз автор цитирует других авторов? Я бы предпочел сделать это из объекта self, если это возможно, но если нет, я мог бы использовать annotate() или aggregate(). Но как?

Мои модели

class Author(models.Model):
    name = models.CharField(max_length=100)

    @property
    def times_quoted_by_other_authors(self):
        return self.authors_quoted_books.count()

    @property
    def times_quoted_other_authors(self):
        pass
        # What do I return here

class Book(models.Model):
    name = models.CharField(max_length=300)
    author = models.ForeignKey(
        Author, on_delete=models.CASCADE, related_name='author_books',
        null=True
    )
    authors_quoted = models.ManyToManyField(
        Author,
        related_name='authors_quoted_books'
    )

Запрос SQL для times_quoted_other_authors:

SELECT COUNT(*) AS times_quoted_other_authors
FROM authors_book_authors_quoted
WHERE book_id IN (SELECT id
                  FROM authors_book
                  WHERE author_id = 1);

1 Ответ

0 голосов
/ 24 марта 2020

Я получил это для работы с использованием агрегата:

@property
def times_quoted_other_authors(self):
    return Book.objects.filter(author=self).aggregate(
        count=Count('authors_quoted')
    )['count']

Обязательно импортируйте Count

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