gpt4 book ai didi

python - django - 如何用 kwargs 做到这一点

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:29 26 4
gpt4 key购买 nike

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

我有这个 kwargs dic:

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

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

我想,我会像这样为 name__startswith 设置 distinct() 循环:

for q in kwargs: 
if q == 'name__startswith':
Thing.objects.filter(name__startswith=somename).distinct('id')

然后动态查询所有:

allthings = Thing.objects.filter(**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 进行评估。看看这个例子:

>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)

虽然这看起来像三次数据库命中,但实际上它只命中一次数据库,在最后一行 (print(q))。通常,在您“请求”之前,不会从数据库中获取 QuerySet 的结果。当您这样做时,将通过访问数据库来评估 QuerySet。有关评估发生的确切时间的更多详细信息,请参阅何时评估查询集。

关于python - django - 如何用 kwargs 做到这一点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16671355/

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