Django过滤器相关对象

2024-09-29 19:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个位置列表,其中每个位置都有一些对象的列表。我想确保我得到这些位置,但是要有一个经过过滤的对象列表。在

这是模型.py公司名称:

class Location(models.Models):
    # fields


class LocationObject(models.Models):
    location = models.ForeignKey(Location, related_name="objects_list")
    # other fields that are used in filtering

下面是我如何进行筛选:

^{pr2}$

问题是,通过使用这种过滤方法,我在每个位置得到一个对象列表,其中至少有一个对象满足locations.filter()中的条件。这不是我真正需要的。我需要排除不满足filter()方法中条件的所有对象(我是说LocationObject)。在

有什么办法吗?在

更新。一点澄清

以下是该列表的外观:

Location #1
   - Object 1 (size=40)
   - Object 2 (size=45)
   - Object 3 (size=30)

Location #2
   - Object 4 (size=20)
   - Object 5 (size=25)

我想用size属性过滤每个位置对象。假设这个条件:Location.objects.filter(objects_list__size__gte=40)。这将匹配仅包含具有此属性的单个列表项的位置。这不是我需要的。预期结果应为:

Location #1:
   - Object 1 (size=40)
   - Object 2 (size=45)

Tags: 对象方法fields列表sizeobjectsobjectmodels
3条回答

假设您确实希望这些位置至少有一个对象满足这两个条件,则可以执行以下操作:

locations = locations.filter(objects_list__size__gte=request_square_from, 
                             objects_list__size__lte=request_square_to)

但由于您不确定是否同时具有这两个参数,因此无法做到这一点。但是,您可以使用Q对象来实现它:

^{pr2}$

如果我没有错,你想要的是exclude()。在

filter()用于筛选出所需的所有对象。所以你可以使用:

locations = locations.filter(objects_list__size__gte=request_square_from)

这将提供满足此条件的所有对象。在

但如果要排除匹配查询。您需要使用exclude()

locations = locations.exclude(objects_list__size__gte=request_square_from)

这将为您提供不满足条件的对象,并返回其余对象。在

根据您的更新,您需要一个位置对象列表,而不是位置,因此,与其过滤位置,不如过滤位置对象!在

objects = LocationObject.objects.all()
if request_square_from:
    objects = objects.filter(size__gte=request_square_from)

if request_square_to:
    objects = objects.filter(size__lte=request_square_to)

您的没有限制过滤外键,您可以过滤任何模型实例。在

如果在这之后,你想要任何物体的位置,你只要。。。在

^{pr2}$

相关问题 更多 >

    热门问题