0

我正在尝试执行 Django 查询:

#att.name is a string
kwargs = {att.name : F('node__product__' + att.name) }
temps = Temp.objects.exclude(**kwargs)

我想知道这是否正确。到目前为止,我看到的所有示例都在值中使用字符串,但是如果值是函数,我应该像这样将值设为字符串吗?

kwargs = {att.name : 'F('node__product__' + att.name)' }

值中的函数是在参数列表中急切执行还是等到需要时才执行?

4

4 回答 4

5

在 python 中,表达式总是被急切地求值。python 中没有惰性求值。一些库通过允许应该是某种特定类型的值而不是字符串来解决这个有用的特性的缺失,它稍后会被它所取代eval。您可以通过这种方式声明 django 模型的某些部分(以便您可以声明相互引用的外键关系),但 django 的查询接口没有。当字符串是“预期的”时,您通常无法使用这种技术,因为您无法区分字符串值和应该eval编辑的字符串。

于 2011-07-28T00:21:09.680 回答
0

我不确定这个问题是因为您好奇还是您正在尝试寻找加载查询的方法。所以我来猜一猜:

我将使用 Q() 函数并可能将它们加载到 args 以稍后使用 for 将它们设置在 Temp.objects.exclude 上,如下所示:

def mylolfunc(self, *args,**kwargs):
    queryset = Q() 
    for query in args:
        queryset |= query
return Temp.objects.filter(queryset)

其中查询是 Q(att.name = F('node_ product _' + att.name)) 或更多的 Q 对象。

如果您想查看它,这里是文档。

在您询问信息之前,此查询不会执行,因此它会很懒惰。我的意思是,直到你做类似的事情

myquery = mylolfunc(*args)
myquery[0]  #-----> executes query here
于 2011-07-28T01:48:46.887 回答
0

只有第一个是正确的:

kwargs = {att.name : F('node__product__' + att.name) }
temps = Temp.objects.exclude(**kwargs)

我不明白懒惰/渴望与这个问题有多大关系。

于 2011-07-28T00:09:43.087 回答
0

在调用函数之前评估函数参数:

>>> def foo(x): return x
...: 

>>> foo(sum(range(10)))
<<< 45

当您创建 dict 时,所有内容都会在那时进行评估:

>>> kwargs = {'key': sum(range(10))}

>>> kwargs
<<< {'key': 45}

所以...

>>> def foo(**kwargs): return kwargs
...: 

>>> foo(**kwargs)
<<< {'key': 45}
于 2011-07-28T00:26:07.490 回答