当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Django中,如何使用动态字段查找过滤QuerySet?》经验,为你挑选了3个好方法。

给出一个类:

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习语.



1> Daniel Naab..:

Python的参数扩展可用于解决此问题:

kwargs = {
    '{0}__{1}'.format('name', 'startswith'): 'A',
    '{0}__{1}'.format('name', 'endswith'): 'Z'
}

Person.objects.filter(**kwargs)

这是一个非常常见且有用的Python习语.


很好,很好,**很好**!
只需快速解决问题:确保kwargs中的字符串类型为str而不是unicode,否则filter()会发牢骚.
@DanielNaab但这只适用于处理AND条件过滤的kwargs,OR条件的任何替代方法.
@prateek你总是可以使用Q对象:http://stackoverflow.com/questions/13076822/django-dynamically-filtering-with-q-objects

2> shacker..:

一个简化的例子:

在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")   


-1在用户导入上调用`eval()`是一个坏主意,即使你完全信任你的用户.这里的JSON字段会更好.

3> Brent81..:

Django.db.models.Q正是你想要的Django方式.


您(或某人)可以提供如何在使用动态字段名称时使用Q对象的示例吗?
它与[Daniel Naab的答案](http://stackoverflow.com/a/310785/4021086)相同.唯一的区别是您将参数传递给Q对象构造函数.`Q(**filters)`,如果你想动态构建Q对象,你可以将它们放在一个列表中并使用`.filter(*q_objects)`,或者使用按位运算符来组合Q对象.
这个答案实际上应该包括使用Q解决OP问题的示例。
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有