我有一个带有ImageField的模型,我正在使用Django Haystack为搜索编制索引,我想在搜索结果中使用这些图像。如果我错了,请纠正我,但你不能在Django Haystack SearchQuerySet中拥有一个ImageField。那么访问与SearchQuerySet关联的模型ImageFields的最佳方法是什么?我是否真的必须遍历模型ID并将它们添加到单独的QuerySet中?
答案 0 :(得分: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
答案 1 :(得分: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
包的一部分。
此代码段将使用学校模型的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。最简单的方法,可能是neater只是使用School对象中的对象,如下所示:
<img src="{{ school.object.cover.url }}" />
答案 2 :(得分:2)
只需使用result.object.my_image_field
即可。 object
属性包含与搜索结果关联的完整Django对象。