0

1 つの日付の時間を含むモデル Time があります。次に、Time モデルの ForeginKey フィールドであるオブジェクト Person があります。私は Time オブジェクトにインデックスを付けて、 Person が特定の時間空間に時間を持っているかどうかを調べています。

これをインデックスに追加しようとしましたが、インデックスを作成するとエラーが発生します:

def index_queryset(self, using=None):
    return self.get_model().objects.all().distinct('person')

エラー:

DatabaseError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions

したがって、時間ではなく人物のみを表示したいのですが、時間をインデックス化する必要があると思うので、指定された日付間隔の間に時間がある人を取得できます。

4

2 に答える 2

0

これを試して:

def index_queryset(self, using=None):
    return self.get_model().objects.all().order_by('person').distinct('person')
于 2013-08-22T18:18:07.513 に答える
0

私はこれを自分で解決しました。何らかの理由でメソッド build_queryset が order_by 句をオーバーライドしたため、build_queryset をオーバーライドする必要がありました。order_by 句にコメントした return を参照してください。

これが私がインデックスクラスに入れたメソッドです:

def build_queryset(self, using=None, start_date=None, end_date=None):
    """
    Get the default QuerySet to index when doing an index update.

    Subclasses can override this method to take into account related
    model modification times.

    The default is to use ``SearchIndex.index_queryset`` and filter
    based on ``SearchIndex.get_updated_field``
    """
    extra_lookup_kwargs = {}
    model = self.get_model()
    updated_field = self.get_updated_field()

    update_field_msg = ("No updated date field found for '%s' "
                        "- not restricting by age.") % model.__name__

    if start_date:
        if updated_field:
            extra_lookup_kwargs['%s__gte' % updated_field] = start_date
        else:
            warnings.warn(update_field_msg)

    if end_date:
        if updated_field:
            extra_lookup_kwargs['%s__lte' % updated_field] = end_date
        else:
            warnings.warn(update_field_msg)

    index_qs = None

    if hasattr(self, 'get_queryset'):
        warnings.warn("'SearchIndex.get_queryset' was deprecated in Haystack v2. Please rename the method 'index_queryset'.")
        index_qs = self.get_queryset()
    else:
        index_qs = self.index_queryset(using=using)

    if not hasattr(index_qs, 'filter'):
        raise ImproperlyConfigured("The '%r' class must return a 'QuerySet' in the 'index_queryset' method." % self)

    # `.select_related()` seems like a good idea here but can fail on
    # nullable `ForeignKey` as well as what seems like other cases.
    return index_qs.filter(**extra_lookup_kwargs)#.order_by(model._meta.pk.name)

def index_queryset(self, using=None):
    return self.get_model().objects.all().distinct('person').order_by('person')
于 2013-08-23T09:27:11.567 に答える