【问题标题】:Accessing ImageFields associated with Haystack SearchQuerySet访问与 Haystack SearchQuerySet 关联的 ImageField
【发布时间】:2012-05-22 14:34:19
【问题描述】:

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

【问题讨论】:

    标签: django django-haystack imagefield


    【解决方案1】:

    访问对象会命中数据库。

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

    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

    【讨论】:

    • 这仅适用于支持绝对路径的存储,例如它不适用于 django-storages 的 Amazon S3 存储。
    • @goldstein 我相信这实际上是正确的解决方案。如果存储不支持完整路径,您可以在显示结果时构建它。我使用return obj.image_field.url 而不是.path
    【解决方案2】:

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

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

    说你有这个模型:

    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 包的一部分。

    此代码 sn-ps 将使用 School 模型的 namecity 字段进行索引。然后在您的 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 }}" />
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多