给出一个类:
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`.
Daniel Naab.. 288
Python的参数扩展可用于解决此问题:
kwargs = { '{0}__{1}'.format('name', 'startswith'): 'A', '{0}__{1}'.format('name', 'endswith'): 'Z' } Person.objects.filter(**kwargs)
这是一个非常常见且有用的Python习语.
Python的参数扩展可用于解决此问题:
kwargs = { '{0}__{1}'.format('name', 'startswith'): 'A', '{0}__{1}'.format('name', 'endswith'): 'Z' } Person.objects.filter(**kwargs)
这是一个非常常见且有用的Python习语.
一个简化的例子:
在Django调查应用程序中,我想要一个显示注册用户的HTML选择列表.但是因为我们有5000个注册用户,所以我需要一种方法来根据查询条件过滤该列表(例如只完成某个研讨会的人).为了使调查元素可以重复使用,我需要创建调查问题的人能够将这些标准附加到该问题(不想将查询硬编码到应用程序中).
我提出的解决方案不是100%用户友好(需要技术人员的帮助来创建查询)但它确实解决了问题.创建问题时,编辑器可以将字典输入自定义字段,例如:
{'is_staff':True,'last_name__startswith':'A',}
该字符串存储在数据库中.在视图代码中,它以self.question.custom_query
.它的值是一个看起来像字典的字符串.我们用eval()把它变成一个真正的字典,然后用**kwargs将它填入查询集:
kwargs = eval(self.question.custom_query) user_list = User.objects.filter(**kwargs).order_by("last_name")
Django.db.models.Q正是你想要的Django方式.