我正在做我的第一个Django项目,我需要了解Django中使用反射的方式。
- 我有方法
category_autocomplete
,我用jQuery获得一个类别字段的自动完成。 - 我需要自动完成在一些更多的地方,但在不同的事情。我认为它可能是一个好主意,使类重用。
- 我已经开始上课,但我不确定如何进行。
问题是django使用filter
函数的方式。它有一个类似<param-name>_icontains
的参数。我可以通过使用getattr
和传递参数名称作为字符串轻松地再现lambda,但我无法弄清楚如何使用反射来获得filter
函数的参数名称。
你知道怎么做吗?
class Autocomplete():
@staticmethod
def get_json_autocomplete(self, cur_objects, func):
results = []
for cur_object in cur_objects:
results.append(func(cur_object))
return json.dumps(results)
@staticmethod
def autocomplete(self, request, class_name, attr_name):
term = request.GET.get('term', '')
data = Autocomplete.get_json_autocomplete(
#Problem here
class_name.objects.filter(attr_name=term),
lambda x: getattr(x, attr_name)
)
return HttpResponse(data, 'application/json')
def _get_json_autocomplete(cur_objects, func):
results = []
for cur_object in cur_objects:
results.append(func(cur_object))
return json.dumps(results)
def category_autocomplete(request):
term = request.GET.get('term', '')
data = _get_json_autocomplete(
Category.objects.filter(name__icontains=term),
lambda x: x.name
)
return HttpResponse(data, 'application/json')
我相信你要找的是**
,看看这里和这里。
那部分代码可以是:
def autocomplete(self, request, class_name, attr_name):
term = request.GET.get('term', '')
data = Autocomplete.get_json_autocomplete(
class_name.objects.filter(**{attr_name + '__icontains': term}),
lambda x: getattr(x, attr_name)
)
return HttpResponse(data, 'application/json')