首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django干草堆SearchQuerySet to QuerySet

Django干草堆SearchQuerySet to QuerySet
EN

Stack Overflow用户
提问于 2012-11-30 09:47:26
回答 4查看 4.2K关注 0票数 6

我有一个非常通用的视图/模板来显示给定模型的查询集的内容。

我使用来自12个地方的12个不同的查询集,现在我想集成干草堆搜索,但我不能,因为SearchQuerySet与模板中的QuerySet不匹配。

用正常的查询集

代码语言:javascript
复制
{%for obj in qs%}
    {{obj.foreign_key.name }}
{%endfor%}

对于SearchQuerySet,我需要做的就是

代码语言:javascript
复制
{%for obj in qs%} 
   {{obj.object.foreign_key.name}}
{%endfor%}

这基本上破坏了我的通用模板和视图,这些模板和视图现在知道queryset来自何处。

我希望有一种方式让搜索集表现为正常的查询集,我知道:

  • 我将输掉分数,尽管我会执行命令。
  • 我需要做一个load_all()来使整个对象在

关于如何保持模板的泛型,但接受SearchQuerySet或将SearchQuerySet转换为QuerySet的任何提示?

EN

回答 4

Stack Overflow用户

发布于 2014-01-18 15:58:03

我使用了一个简洁的生成器技巧,避免将object方法添加到您的模型中,并允许您对Django的QuerySet和Haystack SearchQuerySet使用相同的模板。

诀窍是将您的SearchQuerySet封装到一个生成器中。

代码语言:javascript
复制
# In your view...

def queryset_gen(search_qs):
    for item in search_qs:
        yield item.object  # This is the line that gets the model instance out of the Search object

qs = queryset_gen(sqs)

这种方法的优点是它维护了返回SearchQuerySet的顺序,并且节省了计算和内存,因为您不需要创建或存储列表的另一个实例。

票数 7
EN

Stack Overflow用户

发布于 2012-12-05 21:35:04

如何在您的模型中添加一个名为object的方法,以便您的查询集能够像SearchQuerySet一样运行?例如

代码语言:javascript
复制
class MyModel(models.Model):
    ...

    @property
    def object(self):
        return self
票数 4
EN

Stack Overflow用户

发布于 2014-11-21 20:08:56

对于其他来这里寻找更通用的方法来对待SQS的人来说,就像对待QS一样。

对于Django Rest框架,我需要这样的东西,所以我为sqs -> qs创建了下面的包装器。它允许对SQS进行处理,就好像它是一个对迭代和切片的有限支持的查询集。

还可以在迭代生成器函数之前调用load_all。

代码语言:javascript
复制
class SearchQuerySetWrapper(object):
    """
    Decorates a SearchQuerySet object using a generator for efficient iteration
    """
    def __init__(self, qs):
        self.qs = qs

    def count(self):
        return self.qs.count()

    def __iter__(self):
        for result in self.qs:
            yield result.object

    def __getitem__( self, key):
        if isinstance(key, int) and (key >= 0 or key < self.count()):
            # return the object at the specified position
            return self.qs[key].object
        # Pass the slice/range on to the delegate
        return SearchQuerySetWrapper(self.qs[key])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13642617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档