Django Haystack を使用して検索用にインデックスを作成している ImageField を持つモデルがあり、検索結果で画像を使用したいと考えています。私が間違っている場合は訂正してください。ただし、Django Haystack SearchQuerySet に ImageField を含めることはできません。では、SearchQuerySet に関連付けられたモデルの ImageFields にアクセスする最善の方法は何でしょうか? モデル ID をループして別の QuerySet に追加する必要はありますか?
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
質問がかなり古いことは知っていますが、同じ問題があり、共有する情報があります。
読むのが面倒?ソリューションにジャンプします。
このモデルがあるとします:
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 オブジェクトはindexes
パッケージの一部ではないため、ImageField は含めませんでした。
このコード スニペットは、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 }}" />
を使用するだけresult.object.my_image_field
です。このobject
属性には、検索結果に関連付けられた完全な Django オブジェクトが含まれます。