【问题标题】:How to use Q objects to check if any members of arbitrary-length list are in Many-To-Many Relationship如何使用 Q 对象检查任意长度列表的任何成员是否处于多对多关系
【发布时间】:2013-06-01 22:49:53
【问题描述】:

假设我有以下 Django 模型:

class myObj1(models.Model):
    myField1 = models.IntegerField()     


class myObj2(models.Model):
    myLocalObj1 = models.ManyToManyField(myObj1)     

此外,假设我有一个独特的 myObj1s 列表:

a = myObj1(myField=1)
b = myObj1(myField=2)
c = myObj1(myField=3)
myTargetList = [a, b, c]

现在,我想使用 Q 对象编写一个 Django 查询,以便它返回所有 myObj2,其中 myTargetList 的任何成员都为 myLocalObj1。此外,我事先不知道 myTargetList 的确切大小。

我该怎么做?这显然行不通:

myObj2.objects.filter(Q(myLocalObj1__in=myTargetList))

【问题讨论】:

    标签: django django-models django-q


    【解决方案1】:

    编辑:为了使这更符合您的要求(尽管我不一定建议这样做),您可以:

    vallist=[]
    for b in myTargetList:
        vallist.append(b.myField)
    
    myObj2.objects.filter(myLocalObj1__in=myObj1.objects.filter(myField__in=vallist))
    

    这可在此处的 Django 文档中找到: https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

    【讨论】:

    • 那行不通。这不是有效的 python 语法。即使是这样,它也不会产生正确的答案。
    • 嗯,也许我的 python 版本有点不同,使用 2.5 可以正常工作。我会编辑我的答案,也许会得到一些更符合你正在寻找的东西
    猜你喜欢
    • 2013-06-02
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多