Как отфильтровать по количеству вхождений в другой таблице в Django? - PullRequest
0 голосов
/ 10 октября 2018

Вот мои модели:

class Zoo(TimeStampedModel):
    id = models.AutoField(primary_key=True)

class Animal(models.Model):
    id = models.AutoField(primary_key=True)
    zoo = models.ForeignKey(Zoo, on_delete=models.PROTECT, related_name='diffbot_results')

Я бы хотел выполнить такой запрос:

Zoo.objects.filter("WHERE zoo.id IN (select zoo_id from animal_table having count(*) > 10 group by zoo_id)")

1 Ответ

0 голосов
/ 10 октября 2018

Одним из способов является использование необработанного набора запросов :

>>> from testapp.models import Zoo, Animal
>>> z1, z2 = Zoo(), Zoo()
>>> z1.save(), z2.save()
(None, None)
>>> z1_animals = [Animal(zoo=z1) for ii in range(5)]
>>> z2_animals = [Animal(zoo=z2) for ii in range(15)]
>>> x = [a.save() for a in z1_animals+z2_animals]
>>> qs = Zoo.objects.raw("select * from testapp_zoo zoo WHERE zoo.id IN (select zoo_id from testapp_animal group by zoo_id having count(1) > 10)")
>>> list(qs)
[<Zoo: Zoo object (2)>]

Теоретически, для этих документов должна быть возможность передать набор запросов вобычный .filter(id__in=<queryset>), но набор запросов должен выбирать только один столбец, и я не могу найти способ добавить предложение HAVING, не вызывая при этом набор запросов для выбора столбца num_animals, не позволяя использовать его с __in фильтр выражения.

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