Django - 过滤相关对象

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


这是models.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

这是我进行过滤的方法:


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)


守着一只汪
浏览 92回答 3
3回答

慕尼黑的夜晚无繁华

根据您的更新,您需要一个位置对象列表,而不是位置,因此,不要过滤您的位置,而是过滤位置对象!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

qq_遁去的一_1

假设您真的想要那些至少有一个满足这两个条件的对象的位置,您可以这样做: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)

慕仙森

如果我没记错的话,你想要的是exclude().filter()用于过滤掉所有需要的对象。所以你会使用:locations = locations.filter(objects_list__size__gte=request_square_from)这将为您提供满足此条件的所有对象。但是如果你想排除匹配的查询。你需要使用exclude()locations = locations.exclude(objects_list__size__gte=request_square_from)这将为您提供不满足条件的对象并返回其余对象。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go