为了账号安全,请及时绑定邮箱和手机立即绑定

Django - 过滤相关对象

Django - 过滤相关对象

Go
守着一只汪 2022-06-14 09:41:23
假设我有一个位置列表,其中每个位置都有一些对象的列表。我想确保我得到这些位置,但有一个过滤的对象列表。这是models.py的结构:class Location(models.Models):    # fieldsclass LocationObject(models.Models):    location = models.ForeignKey(Location, related_name="objects_list")    # other fields that are used in filtering这是我进行过滤的方法:locations = Location.objects.all()if request_square_from:    locations = locations.filter(objects_list__size__gte=request_square_from)if request_square_to:    locations = locations.filter(objects_list__size__lte=request_square_to)# Other filters ...问题是,通过使用这种过滤方法,我在每个位置都获得了一个对象列表,其中至少有一个对象满足locations.filter(). 这不是我真正需要的。我需要排除每个LocationObject不满足filter()方法中条件的对象(我的意思是 )。有什么想法吗?更新。一点澄清此列表的外观如下: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)
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

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


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)

您不限于过滤外键,您可以过滤任何模型实例。


如果在此之后,您想要任何对象的位置,您只需...


objects[0].location


查看完整回答
反对 回复 2022-06-14
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

假设您真的想要那些至少有一个满足这两个条件的对象的位置,您可以这样做:


locations = locations.filter(objects_list__size__gte=request_square_from, 

                             objects_list__size__lte=request_square_to)

但由于您不确定同时拥有这两个参数,因此您不能这样做。但是,您可以使用Q对象来实现它:


from django.db.models import Q


# ...    

locations = Location.objects.all()

q = Q()    

if request_square_from:

    q &= Q(objects_list__size__gte=request_square_from)    

if request_square_to:

    q &= Q(objects_list__size__lte=request_square_to)    

if q:

    locations = locations.filter(q)


查看完整回答
反对 回复 2022-06-14
?
慕仙森

TA贡献1827条经验 获得超7个赞

如果我没记错的话,你想要的是exclude().

filter()用于过滤掉所有需要的对象。所以你会使用:

locations = locations.filter(objects_list__size__gte=request_square_from)

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

但是如果你想排除匹配的查询。你需要使用exclude()

locations = locations.exclude(objects_list__size__gte=request_square_from)

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


查看完整回答
反对 回复 2022-06-14
  • 3 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信