【问题标题】:Django ORM: filter using a list of objects with an 'and' functionalityDjango ORM:使用具有“和”功能的对象列表进行过滤
【发布时间】:2012-07-10 00:20:36
【问题描述】:

新手问题...

型号:

Item(model.Models):
    ...
    attributes = models.ManyToManyField('Attributes', null=True)
    ...


Attributes(models.Models):
    title = models.CharField(max_length=100, unique = True)
    value = models.TextField()
    ...

我有一个属性对象列表[attObj1, attobj2, attObj3, attObjN],我想在过滤Item 表时使用它。以下查询有效。

items = Item.objects.filter(attributes = attObj1 and attObj2 and attObj3)

问题是我需要动态创建查询(即:attObj1 and attObj2 and attObj3... and attObjN),因为列表中的属性数量未知。

我尝试使用以下复杂的查询集没有运气 (source)。它返回一个空列表。

attList = [attObj1, attObj2, attObj3]
query = Q(attributes = attList.pop(0))
for att in attList:
    query = query & Q(attributes=att)

items = Item.objects.filter(query)

这可能吗?

【问题讨论】:

    标签: django orm


    【解决方案1】:

    你可以试试:

    items = Item.objects.filter(attributes__in=attList)
    

    编辑: 您也可以尝试链接/多个过滤器

    attList = [attObj1, attObj2, attObj3]
    fitems = Items.objects.filter()
    for att in attList:
         fitems = fitems.filter(attributes=att)
    

    fitems 被简化为包含在 attList 中具有属性的对象的集合。

    【讨论】:

    • __in 作为Q(...) | Q(...) 工作,查看他想要的问题and
    • @Ahsan 哦,是的!所以需要应用多个过滤器。已经更新了答案。
    • @Rohan 干得好……你会认为会有一种更直接的方法来做这件事,类似于__in
    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2018-11-18
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多