2017-06-19 9 views
2

Algolia Django integrationを使用していて、TaggitManager()フィールドを含むモデルの問題があります。このコマンドを実行しているとき、私は現在、次のエラーを投げ返されています:DjangoのTaggitタグにインデックスを付ける: '_TaggableManager'オブジェクトに 'name'属性がありません

$ python manage.py algolia_reindex 

AttributeError: '_TaggableManager' object has no attribute 'name' 

は私がTaggit documentationを見て持っていたが、私はちょうど私がAlgoliaで概説された方法を結婚する方法を正確にはわかりません検索インデックスメソッド。

index.py:

import django 
django.setup() 

from algoliasearch_django import AlgoliaIndex 

class BlogPostIndex(AlgoliaIndex): 
    fields = ('title') 
    settings = {'searchableAttributes': ['title']} 
    index_name = 'blog_post_index' 

models.py:

from taggit.managers import TaggableManager 

class Post(models.Model): 
    ...some model fields... 

    tags = TaggableManager() 

答えて

5

は、インデックスへのあなたのポストのフィールドを持つtaggitタグは、あなたは、文字列のリストとしてブログにポストのタグを返す呼び出し可能を公開にする必要があります。

_tagsとして保存することをお勧めします。これはfilter on tags at query timeになります。

あなたPostIndexは次のようになります。Postについては

class PostIndex(AlgoliaIndex): 
    fields = ('title', '_tags') 
    settings = {'searchableAttributes': ['title']} 
    index_name = 'Blog Posts Index' 
    should_index = 'is_published' 

:これらの指示に従い

class Post(models.Model): 
    # ...some model fields... 

    tags = TaggableManager() 

    def _tags(self): 
     return [t.name for t in self.tags.all()] 

、あなたの記録は、それぞれのタグとインデックスが作成されます

Screenshot of a tagAlgolia explorer

Djangoデモのtaggit branchを確認することができます。これは、これらの手順を示しています。

+0

ライブチャットに行くことは可能でしょうか? –

+0

こんにちはMichael、live-chatはAlgoliaのentrepriseのお客様にのみ提供されています。もしあなたが1つの場合は、ダッシュボードにログインし、「ヘルプが必要ですか?」ボタンをクリックします。あなたがまだエンタプライズ顧客でない場合は、support @ algolia.comにサポートリクエストを送信できます:) – PLNech

1

だから、誰もが、私はこの問題を解決するが、私はそれは素敵ではないことを言っているかを教えて答えていないので方法ではなく、 "クリーンな"ソリューションではありません。だから、私がやったことは、サイトパッケージ(env-> lib-> python2.x/3.x-> site_packages-> taggit-> managers.py)の "taggit managers"に入りました。ライン394で、コードのこの美しい作品を見つける:

def __get__(self, instance, model): 
      if instance is not None and instance.pk is None: 
       raise ValueError("%s objects need to have a primary key value " 
           "before you can access their tags." % model.__name__) 
      manager = self.manager(
       through=self.through, 
       model=model, 
       instance=instance, 
       prefetch_cache_name=self.name, # this is the line I comment out when building the index, 
       name=self.name #this is the line I added and needs to be commented out after the index is build. 
      ) 
      return manager 

それでは、私は、検索インデックスを再構築したいときに私がやっていることはprefetch_cache_name=self.name,(行の「#」インフロントを入れて)コメントアウトしてname=self.nameに置き換えるです。したがって、インデックスを構築することができます。インデックスの作成が完了したら、前と同じようにすべてを元に戻す必要があります(「#」をname=self.nameにもう一度、prefetch_cache_name=self.name,をもう一度表示しておきます)。

すでに言及したように、これはおそらく最良の方法ではありませんが、私は同じ痛みがあり、これは私のために働いています。ルーチンがあるときには1分かかります。おそらく2週間に1回インデックスを再構築する必要があるので、それは私にとってはそれほど大したことではありませんが、非常に頻繁に行う必要がある場合、これは迷惑かもしれません...

とにかくお手伝いします。

+1

こんにちは@hanzTheFranz私はこれのようなものを置くことの勇気に感心しますが、これが何かをさらに崩壊させないとは保証しません。 –

1

私自身の質問に答えるには私はモデルとモデルの両方のインデックスを渡しました。したがって、Algoliaはインデックスを付ける対象とインデックスを作成しない対象を認識します。 Algoliaにtaggitタグのインデックスを付ける方法が欲しいですが、残念ながらそれはおそらく不可能です。

マイapps.pyファイル:

import algoliasearch_django as algoliasearch 
from django.apps import AppConfig 
from .index import PostIndex 

class BlogConfig(AppConfig): 
    name = 'blog' 

    def ready(self): 
     Post = self.get_model('Post') 
     algoliasearch.register(Post, PostIndex) 

マイindex.pyファイル:

from algoliasearch_django import AlgoliaIndex 

class PostIndex(AlgoliaIndex): 
    fields = ('title') 
    settings = {'searchableAttributes': ['title']} 
    index_name = 'Blog Posts Index' 
    should_index = 'is_published' 

そして、それはかなりの仕事をするべき!あなたがどのように知っているか、または約10種類のオプションを試した後に簡単!

+0

こんにちはマイケル、AlgoliaのDjango統合メンテナーはこちら。実際のところ現在のバージョンでは、あなたのソリューションが最善の方法です。これは、私は現在、これらのタグをどのように索引付けできるかを調べるために 'taggit'を調査していると言います。 – PLNech

+0

@PLNech Awesome。私は問題がアルゴリアよりもタグギットにあると思う。それでも、私たちは一時的な回避策を実装していると思います。 –

+0

確かに、この問題はおそらく、 '_TaggableManager'が、他のDjangoマネージャのように' name'フィールドを公開していないことが原因である可能性があります(@hansTheFranzの回避策で示されています)。どちらにかかわらず、あなたのタグを適切にインデックスするための私の答えをチェックしてください:) – PLNech

関連する問題