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