首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Django中,如何使用动态字段查找来过滤QuerySet?

在Django中,如何使用动态字段查找来过滤QuerySet?
EN

Stack Overflow用户
提问于 2008-11-22 02:06:06
回答 3查看 67.4K关注 0票数 181

给定一个类:

代码语言:javascript
复制
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=20)

有没有可能有一个基于动态参数进行过滤的QuerySet,如果可能,又是如何实现的?例如:

代码语言:javascript
复制
 # Instead of:
 Person.objects.filter(name__startswith='B')
 # ... and:
 Person.objects.filter(name__endswith='B')

 # ... is there some way, given:
 filter_by = '{0}__{1}'.format('name', 'startswith')
 filter_value = 'B'

 # ... that you can run the equivalent of this?
 Person.objects.filter(filter_by=filter_value)
 # ... which will throw an exception, since `filter_by` is not
 # an attribute of `Person`.
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-11-22 02:48:30

Python的参数扩展可以用来解决这个问题:

代码语言:javascript
复制
kwargs = {
    '{0}__{1}'.format('name', 'startswith'): 'A',
    '{0}__{1}'.format('name', 'endswith'): 'Z'
}

Person.objects.filter(**kwargs)

这是一个非常常见和有用的Python习惯用法。

票数 348
EN

Stack Overflow用户

发布于 2013-05-23 23:55:36

Django.db.models.Q正是您在Django中想要的。

票数 6
EN

Stack Overflow用户

发布于 2021-08-31 07:37:23

此外,为了扩展之前的回答,我提出了一些进一步的代码元素的请求,我添加了一些工作代码,我在我的代码中使用Q。假设我在我的请求中可以有或不有过滤字段,如:

代码语言:javascript
复制
publisher_id
date_from
date_until

这些字段可以出现在查询中,但也可能遗漏。

这就是我如何基于聚合查询上的那些字段构建过滤器,这些字段在初始查询集执行后无法进一步过滤:

代码语言:javascript
复制
# prepare filters to apply to queryset
filters = {}
if publisher_id:
    filters['publisher_id'] = publisher_id
if date_from:
    filters['metric_date__gte'] = date_from
if date_until:
    filters['metric_date__lte'] = date_until

filter_q = Q(**filters)

queryset = Something.objects.filter(filter_q)...

希望这对我有帮助,因为我已经花了相当多的时间来挖掘它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/310732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档