Django - 如何使用kwargs完成这项任务

2024-10-01 07:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道当我在做查询时什么时候触摸数据库。更确切地说,何时执行查询:

我有个夸格斯dic:

kwargs = {'name__startswith':'somename','color__iexact':'somecolor'}

但仅对于name__startswith查询,我需要distinct()。而不是color__iexact。在

我想,我应该为name__startswith设置distinct()循环,如下所示:

^{pr2}$

然后动态查询:

allthings = Thing.objects.filter(**kwargs)

但这有点不对,我好像在做两件不同的事。。在

如何动态地执行这两个查询?在


Tags: name数据库objects动态kwargscolorthingdistinct
2条回答

可以使用models.Q在django中创建动态查询。在

query = models.Q(name__startswith=somename)

query &= models.Q('color__iexact':'somecolor')

all_things = Thing.objects.filter(query).distinct('name')

同时阅读 Constructing Django filter queries dynamically with args and kwargs

django查询集是lazy,因此实际查询不是evaluated until you use the data.

allthings = Thing.objects.filter(**kwargs)

if 'name__startswith' in kwargs:
  allthings = allthings.distinct('id')   

在你实际使用数据之前,不应该进行任何查询。这对于过滤查询非常有用


docs

查询集是懒惰的——创建查询集的行为不涉及任何数据库活动。您可以整天将过滤器堆叠在一起,Django在计算QuerySet之前不会实际运行查询。看看这个例子:

^{pr2}$

虽然这看起来像是三次数据库命中,但实际上它只在最后一行(print(q))命中数据库一次。一般来说,查询集的结果在您“请求”之前不会从数据库中获取。执行此操作时,将通过访问数据库来计算查询集。有关确切何时进行求值的详细信息,请参见何时对QuerySets求值。在

相关问题 更多 >