2016-09-29 36 views
0

我没有很多Python体验,也无法弄清楚如何使用here中描述的SearchVector功能来使用字符串列表。我正在使用Django 1.10和PostgreSQL 9.6,并且已经证实,如果我手动编写这些字段,这将起作用。如何将SearchVector与字符串列表中的多个字段一起使用

该函数来自基于类的视图,其目的是从表单接收字符串,然后对MyApp中所有模型中的所有CharField执行全文搜索,然后返回结果(使用itertools进行规划以合并多个QuerySet一旦我得到这个工作)。我不想对字段进行硬编码,因为我们会定期添加新对象和新字段 - 这是一种企业中间件应用程序,我无法掌握数据。

def get_queryset(self): 
    searchTargets = defaultdict(list) 
    myModels = (obj for obj in apps.get_models() 
       if obj._meta.label.startswith('myapp') 
       and not obj._meta.label == 'myapp.ConfigItem') 
    for thing in myModels: 
     fieldNames = (x.name for x in thing._meta.fields) 
     for thisField in fieldNames: 
      if thing._meta.get_field(thisField).get_internal_type() == 'CharField': 
       searchTargets[thing._meta.object_name].append(thisField) 
    user_query=self.request.GET['user_query'] 
    for key in searchTargets.iterkeys(): 
     targetClass=class_for_name('myapp.models',key) 
     results = targetClass.objects.annotate(
      search=SearchVector(searchTargets[key]), 
      ).filter(search=user_query) 
     #only a single QuerySet will be returned. 
     return results 

我试过','。join(MyList),但当然这只是让一个大字符串。

回答

0

展开列表using * SearchVector将愉快地搜索多个字段。

results = targetClass.objects.annotate(
    search=SearchVector(*searchTargets[key]), 
    ).filter(search=user_query) 
相关问题