代码之家  ›  专栏  ›  技术社区  ›  Visgean Skeloru

基于相关集的Django滤波器

  •  0
  • Visgean Skeloru  · 技术社区  · 6 年前

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

    我们使用Django Rest框架来序列化房子及其房间。问题是我们要按大小过滤房间。我们有一个定义查询集的视图集:

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

    0 回复  |  直到 6 年前
        1
  •  0
  •   Andrey Maslov    6 年前
    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()