【问题标题】:Understanding reflection in django for refactoring了解 django 中的反射以进行重构
【发布时间】:2014-06-03 09:25:35
【问题描述】:

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

【问题讨论】:

    标签: python django python-3.x reflection refactoring


    【解决方案1】:

    我相信您正在寻找的是**,看看herehere

    所以你的那部分代码可能是:

    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')
    

    【讨论】:

    • 我想你想要一个双下划线:attr_name + '__icontains': 那里。
    • 错过了,谢谢 ;-)
    猜你喜欢
    • 2013-08-20
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2019-04-26
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多