gpt4 book ai didi

python - 了解 Django Q - 动态

转载 作者:行者123 更新时间:2023-11-28 22:33:36 24 4
gpt4 key购买 nike

我正在阅读 this article关于动态生成 Q 对象。我理解(大部分)Q 对象,但我不理解作者具体是如何做这个例子的:

# string representation of our queries
>>> predicates = [('question__contains', 'dinner'), ('question__contains', 'meal')]

# create the list of Q objects and run the queries as above..
>>> q_list = [Q(x) for x in predicates]

>>> Poll.objects.filter(reduce(operator.or_, q_list))
[<Poll: what shall I make for dinner>, <Poll: what is your favourite meal?>]

我特别不明白的是列表理解。 Q 对象使用任意关键字参数格式化,例如 Q(question__contains='dinner')

如果按照作者建议的列表推导式那样做,那么在每次迭代时,难道不会有效地将一个元组放在 Q 对象中吗?像这样:Q(('question__contains', 'dinner'))

我不确定这段代码如何生成格式正确的 Q 对象。

最佳答案

这篇文章依赖于 Q() 接受 args 和 kwargs 的未记录的特性。

如果你看source code for the Q class ,您可以看到它在 __init__ 方法中执行了以下操作。

class Q(tree.Node):
...
def __init__(self, *args, **kwargs):
super(Q, self).__init__(children=list(args) + list(kwargs.items()))

如果您调用 Q(question__contains=dinner) 然后在空元组 ()kwargs 中调用 args是一个字典 {'question__contains': 'dinner'}。在 super() 调用中,children 变量是

children = list(args) + list(kwargs.items())

计算结果为

children = list(()) + list(('question__contains', 'dinner'),)

简化为

children = [('question__contains', 'dinner')]

请注意,如果您使用 Q(('question__contains', 'dinner')),您也可以获得此结果。在这种情况下,args 是一个元组 (('question__contains', 'dinner'),)kwargs 是一个空字典 {}

super() 调用中,children 变量计算为

children = list((('question__contains', 'dinner'),)) + list([])

简化为与之前相同的结果,

children = [('question__contains', 'dinner')]

我们已经证明 Q(question__contains=dinner) 等同于 Q(('question__contains', 'dinner')),因此您可以生成列表Q() 对象通过循环遍历列表理解中的 2 元组列表。

>>> predicates = [('question__contains', 'dinner'), ('question__contains', 'meal')]
>>> q_list = [Q(x) for x in predicates]

就个人而言,我可能更喜欢写

>>> predicates = [{'question__contains': 'dinner'},  {'question__contains': 'meal'}]
>>> q_list = [Q(**kwargs) for kwargs in predicates]

这样,您就不会依赖 Q__init__ 方法的行为。

关于python - 了解 Django Q - 动态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39755289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com