防止弹性搜索中的代码重复

时间:2017-01-17 18:03:02

标签: python django elasticsearch

如何在弹性搜索(Django项目)中进行索引编制时避免代码重复?

我的理解是你不能在弹性搜索中返回对象,但很多时候我发现自己使用来自同一相关对象的不同变量。

例如,如果我有Student的索引,并且需要有关他们正在采取的Subject的信息。如果我想要第一个Subject学生注册,我会在弹性搜索中做这样的事情:

...
first_subject_enrolled_id = indexes.IntegerField(model_attr='service__id')

def prepare_first_subject_enrolled_id(self, obj):
    first_subject_enrolled = Subject.objects.filter(student=obj).order_by('id')
    return first_subject_enrolled.id

但是,让我们说我也想要注册的第一堂课的Subject名称。我不得不重复很多代码。例如:

def prepare_first_subject_name(self, obj):
        first_subject_enrolled = Subject.objects.filter(student=obj).order_by('id')
        return first_subject_enrolled.name

有没有办法可以调用索引函数prepare_first_subject_enrolled_id来避免重复和类似代码的不必要索引?

1 个答案:

答案 0 :(得分:0)

尝试使用getattr()函数。见Python string to attribute。您可以动态地将所需的属性传递给同一个函数。我还没有测试下面的代码,但我相信它会让你走上正轨。

def prepare_first_subject_name(self, obj, obj_attribute):
    first_subject_enrolled = Subject.objects.filter(student=obj).order_by('id')
    return getattr(first_subject_enrolled, obj_attribute)