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

don*_*yor 3 python django kwargs

我想知道在执行查询时何时触摸db。更准确地说,何时执行查询:

我有这个kwargs dic:

kwargs = {'name__startswith':'somename','color__iexact':'somecolor'}
Run Code Online (Sandbox Code Playgroud)

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

我想,我会为设定name__startswithdistinct()在这样的循环:

for q in kwargs: 
  if q == 'name__startswith':
    Thing.objects.filter(name__startswith=somename).distinct('id')
Run Code Online (Sandbox Code Playgroud)

然后动态查询所有内容:

allthings = Thing.objects.filter(**kwargs)
Run Code Online (Sandbox Code Playgroud)

但这是不对的,我似乎在这里做两件事。

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

dm0*_*514 5

django querysets是lazy,因此在使用数据之前不会评估实际查询

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

if 'name__startswith' in kwargs:
  allthings = allthings.distinct('id')   
Run Code Online (Sandbox Code Playgroud)

在实际使用数据的单元上方,不应执行任何查询。这对于按需过滤查询非常有用


文档

QuerySet是惰性的–创建QuerySet的操作不涉及任何数据库活动。您可以整天将过滤器堆叠在一起,并且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)
Run Code Online (Sandbox Code Playgroud)

尽管这看起来像是三个数据库命中,但实际上它仅在最后一行(print(q))命中数据库一次。通常,直到您“询问” QuerySet的结果时才从数据库中获取它们。在执行此操作时,将通过访问数据库来评估QuerySet。有关确切何时进行评估的更多详细信息,请参见何时对QuerySet进行评估。