理解django中的反射,以便进行重构



我正在做我的第一个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')

相关内容

  • 没有找到相关文章

最新更新