如何使用 Django ORM 一次过滤 2 个属性

Posted

技术标签:

【中文标题】如何使用 Django ORM 一次过滤 2 个属性【英文标题】:How to filter on 2 attributes at once with Django ORM 【发布时间】:2017-07-28 23:41:34 【问题描述】:

我有以下型号:

class Parent(models.Model):
    item_involved = models.ManyToManyField(Item, through=ItemInvolved)


class ItemInvolved(models.Model):
    parent = models.ForeignKey(Parent, related_name='item_involvement')
    item = models.ForeignKey(Item)
    kind = models.PositiveIntegerField()

我想检索所有Parents,其中Item 的pk=20 和ItemInvolved 的kind=10。

编辑:

假设我有以下对象:

Parent(pk=1)
Parent(pk=2)
Parent(pk=3)
ItemInvolved(pk=11, parent=1, item=18, kind=10)
ItemInvolved(pk=12, parent=1, item=19, kind=10)
ItemInvolved(pk=13, parent=1, item=20, kind=10)
ItemInvolved(pk=14, parent=2, item=20, kind=10)
ItemInvolved(pk=15, parent=3, item=19, kind=10)
ItemInvolved(pk=16, parent=3, item=20, kind=20)

我需要一个可以产生的查询:

[<Parent: 1>, <Parent: 2>]

【问题讨论】:

如果以下任何一个答案对您有所帮助,那么最好接受一个! 【参考方案1】:

parents = Parent.objects.filter(item=20, item__kind=10)

好的。明白了。

parents = Parent.objects.filter(item_involved=20, item_involvement__kind=10)

关于spanning multi valued relationship的进一步解释。

【讨论】:

这不是我想要的。此过滤器 Parent 由它自己的 pk 过滤。 我错误地接受了改变这一点的编辑。对不起。感谢您指出!我刚刚改了。 添加了内容以阐明我想要实现的目标。 item__kind(或者更确切地说是item_involved__kind,我改了名字)也不应该工作。 更新了我的答案(再次!) 不能使用item_involved__kinditem_involved 不带 kind 这是一个相关字段。【参考方案2】:

如果要记录异常,如果对应的查询不成功:

try: parent = Parent.objects.get(item=20, item__kind=10) except Exception as e: print "[CRITICAL] <some_view.py> - ".format(e)

【讨论】:

以上是关于如何使用 Django ORM 一次过滤 2 个属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django ORM 中过滤它

Django ORM:如何根据注释 timedelta 结果进行过滤

Django orm总结

Django ORM 按过滤器排序

Django通过多对多ORM对象中的多个标签进行过滤

使用 django orm 实现我的过滤器