2

我有一个带有 ImageField 的模型,我正在使用 Django Haystack 为搜索建立索引,并且我想在搜索结果中使用这些图像。如果我错了,请纠正我,但在 Django Haystack SearchQuerySet 中不能有 ImageField。那么访问与 SearchQuerySet 关联的模型 ImageField 的最佳方法是什么?我真的必须遍历模型 ID 并将它们添加到单独的 QuerySet 吗?

4

3 回答 3

3

访问对象命中数据库。

如果您不想访问数据库,可以这样索引:

class MyIndex(SearchIndex, Indexable):
   ...
   photo_url = CharField()

   def prepare_photo_url(self, obj):
       return obj.image_field.path

来源:http ://django-haystack.readthedocs.org/en/latest/searchindex_api.html#prepare-foo-self-object

于 2013-06-06T13:28:44.700 回答
3

我知道这个问题已经很老了,但我遇到了同样的问题,我有信息要分享。

懒惰读书?跳转到解决方案

说你有这个模型:

class School(models.Model):
  city = models.CharField(max_length=50)
  name = models.CharField(max_length=50)
  slug = models.SlugField(max_length=50, unique=True)
  cover = models.ImageField(upload_to='images/school-covers/')

你可以看到ImageField : 封面。

如果您想使用带有自动完成功能的 Haystack 索引 School 模型,您应该这样做:

class SchoolIndex(indexes.SearchIndex, indexes.Indexable):
  name = indexes.EdgeNgramField(model_attr='name')
  city = indexes.EdgeNgramField(model_attr='city')
  slug = indexes.CharField(model_attr='slug')

  def get_model(self):
    return School

  def index_queryset(self, using=None):
    # Used when the entire index for model is updated.
    return self.get_model().objects.all()

如您所见,我没有包含 ImageField,因为 ImageField 对象不是indexes包的一部分。

此代码片段将使用School 模型的name和字段进行索引。city然后在您的 AJAX 视图中,您将使用 SearchQuerySet 处理搜索:

def search_ecoles(request):
  name = SearchQuerySet().autocomplete(name=request.POST.get('search_text',''))
  city = SearchQuerySet().autocomplete(city=request.POST.get('search_text',''))

  schools = name | city

  return render(request, 'website/ajax_search.html', {'schools' : schools})

到目前为止,我可以像这样访问我的模板中的结果:

<ul>
  {% for school in schools %}
  <li>
    <span id="name"><a href="/school/{{ school.slug }}/">{{ school.name }}</a></span>
    <span id="city">City: {{ school.city }}</span>
  </li>
  {% endfor %}
</ul>

解决方案

但也许您想访问封面 ImageField。最简单的方法也可能是更整洁的方法就是使用 School 对象中的对象,如下所示:

<img src="{{ school.object.cover.url }}" />
于 2014-03-25T14:52:07.153 回答
2

只需使用result.object.my_image_field. 该object属性包含与搜索结果关联的完整 Django 对象。

于 2012-05-22T14:48:03.360 回答