给定一个类:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=20)
有没有可能有一个基于动态参数进行过滤的QuerySet,如果可能,又是如何实现的?例如:
# 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`.
发布于 2008-11-22 02:48:30
Python的参数扩展可以用来解决这个问题:
kwargs = {
'{0}__{1}'.format('name', 'startswith'): 'A',
'{0}__{1}'.format('name', 'endswith'): 'Z'
}
Person.objects.filter(**kwargs)
这是一个非常常见和有用的Python习惯用法。
发布于 2013-05-23 23:55:36
Django.db.models.Q正是您在Django中想要的。
发布于 2021-08-31 07:37:23
此外,为了扩展之前的回答,我提出了一些进一步的代码元素的请求,我添加了一些工作代码,我在我的代码中使用Q。假设我在我的请求中可以有或不有过滤字段,如:
publisher_id
date_from
date_until
这些字段可以出现在查询中,但也可能遗漏。
这就是我如何基于聚合查询上的那些字段构建过滤器,这些字段在初始查询集执行后无法进一步过滤:
# 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)...
希望这对我有帮助,因为我已经花了相当多的时间来挖掘它。
https://stackoverflow.com/questions/310732
复制相似问题