django haystackクエリーリアルタイム反映

12690 ワード

お客様がC、R、U、Dなどの「ブランド」に関連するオブジェクトを提供するように要求しても.
ブラウザで結果をリアルタイムで反映できないという問題が発生しました.

1.最初の試み

queryset evaluation
class BrandSearch(HaystackViewSet):
    index_models = [models.Brand]
    serializer_class = BrandSearchSerializer

    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        search_set = SearchQuerySet().all()
        ## force evaluate
        search_set.count()
        brand_name = request.query_params['brand_name']
        brand_set_1 = search_set.filter(text__startswith=brand_name)
        brand_set_2 = search_set.filter(text__contains=brand_name)
        brand_set = brand_set_1 | brand_set_2
        serializer = self.get_serializer(brand_set, many=True)
        return Response(serializer.data)
これはお勧めしない方法だと知っていますが.
search setに格納されているクエリーセットをキャッシュする
強引に評価した.
このような問題は確かに解決した.
しかし、このような状態を維持することはできません.

2.2回目の試み

@method_decorator(never_cache, name='dispatch')
class BrandSearch(HaystackViewSet):
    index_models = [models.Brand]
    serializer_class = BrandSearchSerializer

    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        search_set = SearchQuerySet().all()
        ## force evaluate
        #search_set.count()
        brand_name = request.query_params['brand_name']
        brand_set_1 = search_set.filter(text__startswith=brand_name)
        brand_set_2 = search_set.filter(text__contains=brand_name)
        brand_set = brand_set_1 | brand_set_2
        serializer = self.get_serializer(brand_set, many=True)
        return Response(serializer.data)
レコーダを適用しました.
テストサーバは現在AWSを使用してキャッシュを準備しています.
このキャッシュにより,過去に格納された一時キャッシュがリアルタイム性に影響を及ぼすと考えられる.
1回目の試みと繰返しアプリケーションでは,2回目の試みが有効であるか否かを知ることが困難であるため,評価したコードについて注釈処理を行った.
結果は失敗
空のライブラリのキャッシュを削除し、追加の試行も行いましたが、解決しませんでした.

3.3回目の試み(feat.成功)

search_indexes.py修正
class BrandIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    kor_letters = indexes.CharField(model_attr="kor_letters")
    kor_name = indexes.CharField(model_attr="kor_name")
    eng_name = indexes.CharField(model_attr="eng_name")

    autocomplete = indexes.EdgeNgramField()

    def get_model(self):
        return models.Brand

    def index_queryset(self, using=None):
    """Used when the entire index for model is updated."""
        return self.get_model().objects.all()
その後、search_indexes.pyを修正しました.
でもそれが正解
その後haystack公式ファイルをよく読みました
index_querysetメソッドを提供しており、将来の日付になってから結果を表示できる機能だそうです.
そこで、次のようにコードを変更しました.index querysetメソッドがクリアされました.
class BrandIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    kor_letters = indexes.CharField(model_attr="kor_letters")
    kor_name = indexes.CharField(model_attr="kor_name")
    eng_name = indexes.CharField(model_attr="eng_name")

    autocomplete = indexes.EdgeNgramField()

    def get_model(self):
        return models.Brand
haystack公式ファイルソース:https://django-haystack.readthedocs.io/en/master/tutorial.html#handling-data