Django Haystack在两者之间搜索时间并仅显示ForeignKey结果

时间:2013-08-22 10:12:07

标签: django postgresql django-haystack

我有模型时间,其中包含一个日期的时间。然后我有对象Person,它是Time模型中的ForeginKey字段。我正在索引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

所以我只想展示人,而不是时间,但我认为我必须指数时间,所以我可以得到时间介于给定日期之间的人。

2 个答案:

答案 0 :(得分:0)

试试这个:

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

答案 1 :(得分:0)

我自己解决了这个问题。由于某种原因,方法build_queryset覆盖了order_by子句,所以我不得不重写build_queryset,请参阅return,其中我评论了order_by子句。

以下是我在索引类中添加的方法:

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')