2

Django Haystack を使用して検索用にインデックスを作成している ImageField を持つモデルがあり、検索結果で画像を使用したいと考えています。私が間違っている場合は訂正してください。ただし、Django Haystack SearchQuerySet に ImageField を含めることはできません。では、SearchQuerySet に関連付けられたモデルの ImageFields にアクセスする最善の方法は何でしょうか? モデル ID をループして別の QuerySet に追加する必要はありますか?

4

3 に答える 3

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

于 2013-06-06T13:28:44.700 に答える
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 オブジェクトは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 }}" />
于 2014-03-25T14:52:07.153 に答える
2

を使用するだけresult.object.my_image_fieldです。このobject属性には、検索結果に関連付けられた完全な Django オブジェクトが含まれます。

于 2012-05-22T14:48:03.360 に答える