Как вы пишете Django запрос, где условие, если COUNT связанных предметов? - PullRequest
0 голосов
/ 09 апреля 2019

Я использую Django и Python 3.7.У меня есть эти две модели, связанные друг с другом через внешний ключ ...

class Website(models.Model):
    objects = WebsiteManager()
    path = models.CharField(max_length=100)



class Article(models.Model):
    website = models.ForeignKey(Website, on_delete=models.CASCADE, related_name='articlesite')
    title = models.TextField(default='', null=False)
    url = models.TextField(default='', null=False)
    created_on = models.DateTimeField(db_index=True, default=datetime.now)

Я хочу написать запрос Django, который возвращает веб-сайты, с которыми связано более 100 статей.В PostGres я могу написать этот запрос

select w.id, count(*) FROM website w, article a where w.id = a.website_id group by w.id;

, но мне неясно, как это сделать с помощью запроса Django.Как мне написать запрос, где условие, если функция COUNT?

Редактировать:

Я изменил свой запрос, чтобы добавить условие ...

qset = Website.objects.annotate(articlesite_count=Count('articlesite')).filter(
                         articlesite__edited_date__null=True,
                         articlesite_count__gte=100)

но теперь это приводит к ошибке

Unsupported lookup 'null' for DateTimeField or join on the field not permitted.

1 Ответ

2 голосов
/ 09 апреля 2019

Используйте аннотирование, затем отфильтруйте

<b>from django.db.models import Count</b>

Website.objects.<b>annotate(articlesite_count=Count('articlesite')).filter(articlesite_count__gte=100)</b>

UPDATE-1

from django.db.models import Count

Website.objects.<b>filter(articlesite__edited_date__isnull=True)</b>.annotate(
    articlesite_count=Count('articlesite')).filter(
    articlesite_count__gte=100)
...