【问题标题】:Django filter based on related set基于相关集的Django过滤器
【发布时间】:2020-10-30 16:29:36
【问题描述】:

我们有以下型号:


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 框架过滤器,因此它会非常复杂。

【问题讨论】:

  • 你的模型House如何连接到Room你能提供完整的代码吗?
  • 抱歉,忘记了 :( 现在添加了。

标签: python django django-orm


【解决方案1】:
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()

【讨论】:

  • 这为您提供了大房间的房屋。我们想过滤房间本身。我们在房屋和房间上使用 django 序列化程序,我们需要过滤房间。
  • 我不明白你的问题。如果您想获得房间,请使用Room.objects.filter(size__gte=10, house=<House_object_which you want to filter>)
  • 这为您提供每间房屋的房间。您将对 n 栋房屋进行 n 次查询。我们希望所有这些都发生在一个查询中。
  • Room.objects.filter(size__gte=10, house__in=)
猜你喜欢
  • 1970-01-01
  • 2020-08-15
  • 2018-03-01
  • 1970-01-01
  • 2021-08-30
  • 2012-12-03
  • 2020-08-28
  • 2020-10-22
  • 2019-07-31
相关资源
最近更新 更多