基于相关集的Django过滤器

时间:2020-07-10 00:38:07

标签: python django django-orm

我们有以下型号:


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 :(得分:0)

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()