Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 访问与Haystack SearchQuerySet关联的ImageFields_Django_Django Haystack_Imagefield - Fatal编程技术网

Django 访问与Haystack SearchQuerySet关联的ImageFields

Django 访问与Haystack SearchQuerySet关联的ImageFields,django,django-haystack,imagefield,Django,Django Haystack,Imagefield,我有一个带有ImageField的模型,我正在使用Django Haystack为搜索建立索引,我想在搜索结果中使用这些图像。如果我错了,请纠正我,但在Django Haystack SearchQuerySet中不能有ImageField。那么,访问与SearchQuerySet关联的模型ImageFields的最佳方式是什么?我真的必须循环模型ID并将它们添加到单独的查询集中吗?只需使用result.object.my\u image\u字段即可。对象属性包含与搜索结果关联的完整Django

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

只需使用
result.object.my\u image\u字段即可。
对象
属性包含与搜索结果关联的完整Django对象。

访问对象会命中数据库

如果不想访问数据库,可以通过以下方式进行索引:

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

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

来源:

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

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

说你有这个模型:

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/')
您可以看到图像字段:封面

如果要使用具有自动完成功能的Haystack为学校模型编制索引,应执行以下操作:

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()
<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,因为ImageField对象不是
索引
包的一部分

此代码段将使用学校模型的
名称
城市
字段进行索引。然后在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})
到目前为止,我可以通过以下方式访问模板中的结果:

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()
<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>
    {学校中的学校百分比%}
  • 城市:{{school.City}
  • {%endfor%}
解决方案 但也许你想访问封面图像字段。最简单的方法可能也是最整洁的方法就是在学校物体内使用物体,如下所示:

<img src="{{ school.object.cover.url }}" />


仅适用于支持绝对路径的存储,例如,它不适用于django storages的Amazon S3存储。@goldstein我相信这实际上是正确的解决方案。如果存储不支持完整路径,则可以在显示结果时构建它。不过,我使用了
返回obj.image\u field.url
而不是
.path