如何使用 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()
我想检索所有Parent
s,其中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__kind
。 item_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 个属性的主要内容,如果未能解决你的问题,请参考以下文章