Joe*_*e J 11 django search django-queryset relation django-haystack
我有可以属于一个或多个组织模型实例的事件模型实例.我已经实现了haystack 2.0.0来索引我的所有事件.这是一个示例搜索索引.
class EventIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
organization_slug = indexes.CharField(model_attr='organization__slug',
weight=5.0)
organization_name = indexes.CharField(model_attr='organization__name',
weight=5.0)
name = indexes.CharField(model_attr='name', weight=10.0)
....
def get_model(self):
return Event
def index_queryset(self):
return Event.objects.filter()
Run Code Online (Sandbox Code Playgroud)
我的问题是如何构建一个基于一个或多个组织过滤事件的SearchQuerySet查询. 例如,我想查找属于"orgnization1"和"organization3"的所有事件(其中组织列表可以是任意长度)
作为Django查询,它可能看起来像这样:
Event.objects.filter(organization__in=[orgnization1, organization3]).filter(...)
Run Code Online (Sandbox Code Playgroud)
如何将其转换为haystack查询?这是我的尝试,但我真的不知道我在做什么......
organization_list = [organization1.slug, organization2.slug]
SearchQuerySet().filter_or(organization__contains=organization_list)
Run Code Online (Sandbox Code Playgroud)
以下是我的模型外观的示例:
class Event(models.Model):
name = models.CharField(max_length=64)
organization = models.ForeignKey('mymodule.Organization')
...
class Organization(models.Model):
slug = models.SlugField(max_length=64)
name = models.CharField(max_length=64)
...
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢.
Joe*_*e J 19
我想我找到了解决方案.只是分享它.显然,Haystack有一个名为SQ()的对象,其功能类似于Django的Q()对象.我找到了一个可以在Django的Q对象实例上调用add()方法来添加更多查询参数的地方.似乎与SQ以相同的方式工作.
from haystack.forms import SearchForm
from haystack.query import SQ, SearchQuerySet
from haystack.views import SearchView
class CustomSerchView(SearchView):
def __call__(self, request):
self.request = request
########### Custom stuff
user = request.user
organization_list = [organization1.slug, organization2.slug, ....]
sq = SQ()
for slug in organization_list:
sq.add(SQ(organization_slug=slug), SQ.OR)
sqs = SearchQuerySet().filter(sq)
##########
self.form = self.build_form(form_kwargs={'searchqueryset':sqs})
self.query = self.get_query()
self.results = self.get_results()
return self.create_response()
Run Code Online (Sandbox Code Playgroud)