Django фильтр на основе соответствующего набора - PullRequest
0 голосов
/ 10 июля 2020

У нас есть следующие модели:


class House(models.Model):
     pass

class Room(models.Model):
     house = models.ForeignKey(house)
     size = models.IntegerField()

Мы используем Django Rest Framework для сериализации дома и его комнат. Проблема в том, что мы хотим отфильтровать комнаты по размеру. У нас есть набор, в котором мы определяем набор запросов:

def get_queryset():
    return House.objects.filter(...)

вещи, которые мы пробовали:

  • House.objects.filter(room_set__size__gte=10) - но это дает дома с комнатами больше 10, но это на самом деле не отфильтровывать комнаты
  • House.objects.filter().annotate(big_rooms=FilteredRelation('room', condition=Q(room_set__size__gte=10))) это казалось наиболее актуальным, но не имело никакого эффекта: (

Я также рассматривал возможность использования .extra(), но кажется, что он устарел так что не лучшее решение ... Я знаю, что могу использовать пользовательский sql, однако мы используем фильтры Django rest, и поэтому это было бы довольно сложно.

1 Ответ

0 голосов
/ 11 июля 2020
class House(models.Model):
    address = models.TextField(verbose_name='Addr', max_length=255)

    def __str__(self):
        return self.address


class Room(models.Model):
    house = models.ForeignKey(House, on_delete=models.CASCADE, related_name='room')
    size = models.IntegerField(verbose_name="size meters x2")

теперь, если вы хотите выбрать все дома с размером комнаты больше или равным 10, вы можете использовать House.objects.filter(room__size__gte=10).distinct()

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