Подсчет значения «многие ко многим» в фильтре - PullRequest
3 голосов
/ 18 марта 2020

Я пытаюсь сделать так

мой класс здесь

class TweetJson(models.Model):

    authors = models.ManyToManyField(Station)

и фильтр

MyText.objects.filter(Q(authors__count__gte=1))

Однако он возвращается.

Related Field got invalid lookup: count

Есть ли способ подсчитать количество объектов "многие ко многим"?

Ответы [ 3 ]

3 голосов
/ 18 марта 2020

Вы можете посчитать количество связанных объектов, добавив аннотации:

from django.db.models import Count

MyText.objects.filter(
    <b>nauthors=Count('authors')</b>
).filter(<b>nauthors__gte=1</b>)

Здесь вы, однако, фильтруете на MyText s хотя бы с одним автором. Вы можете сделать это путем фильтрации значений, отличных от NULL, и затем вернуть отдельный набор:

MyText.objects.filter(<b>authors__isnull=False</b>)<b>.distinct()</b>
3 голосов
/ 18 марта 2020

Правильный способ сделать это - , показанный здесь .

. Вам нужно сначала аннотировать каждый TweetJson со счетом authors:

from django.db.models import Count
TweetJson.objects.annotate(num_authors=Count('authors'))

И после этого вы можете выполнить поиск __gte для аннотированного поля:

TweetJson.objects.annotate(num_authors=Count('authors')).filter(num_authors__gte=1)
2 голосов
/ 18 марта 2020

Вы можете рассчитывать так же:

from django.db.models import Count


MyText.objects.annotate(no_of_authors=Count('authors')).filter(no_of_authors__gte=1)

Надеюсь, это сработает для вас.

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