Django Haystack搜索时间介于和之间,只显示ForeignKey结果



我有一个模型Time,它包含一个日期的时间。然后我有了对象Person,它是时间模型中的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

所以我只想显示个人,而不是时间,但我想我必须索引时间,这样我就可以得到在给定日期间隔之间有时间的人。

试试这个:

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

我自己解决了这个问题。由于某种原因,方法build_queryset重写了order_by子句,所以我不得不重写build_queryset,请参阅我注释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')

最新更新