【问题标题】:Search from a Foreign Key in Django Haystack从 Django Haystack 中的外键搜索
【发布时间】:2014-11-04 08:10:36
【问题描述】:

我有这两个模型:

class Shop(CustomBaseModel):
    username = models.CharField(max_length=200)
    bio = models.CharField(max_length=200)


class Item(CustomBaseModel):
    shop = models.ForeignKey(Shop)
    tags = models.TextField()

我在 search_indexes.py 中有这个索引:

class ItemIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    tags = indexes.CharField(model_attr='tags')

还有这个 item_text.txt 文件:

{{ object.tags}}

这是我的看法:

def search(request):
    form = ItemSearchForm(request.GET)
    results = form.search()
    return render(request, 'search/search.html', {
        'items': results
    })

这是我的表格:

class ItemSearchForm(SearchForm):
    def search(self):
        sqs = super(ItemSearchForm, self).search().models(Item, Shop)
        return sqs

这是模板:

 {% if items|length > 0 %}
        <h1>Items</h1>
        {% for item in items %}
            <p>
                {{ item.tags }}
            </p>
        {% endfor %}
 {% endif %}

这是从标签中搜索并且工作正常。但是,如果有人包含该商店的用户名或简历,我如何显示属于该商店的所有商品?

【问题讨论】:

  • 您在模板中使用变量 items 做什么?在我的答案中检查我的编辑
  • 我包含了模板代码。 @Liarez
  • 我建议您检查我的edit2并更改您的items_text.txt文件并添加{{item.shop.username}}{{item.shop.bio}},因此如果您查找商店用户名,它将返回所有属于它的物品

标签: python django django-haystack


【解决方案1】:

当使用 Haystack 并获得结果查询集时,您有一个对象列表,这些对象的 字段 取决于您在其中写入的内容:

templates/search/indexes/project_name/modelName_text.txt

但是这里总有一个字段可以帮助你,字段object

如果我理解你想知道的问题:

  • 当用户使用其用户名或个人简介查找商店时,如何显示商店的所有商品

我将向你展示如何在命令行中执行此操作,你可以将此代码应用于你的视图/模板:

from haystack.query import SearchQuerySet

# First we make a search to get some shops 
# assuming you defined username field in search_indexes.py for Shop object
shop_list = SearchQuerySet().filter(username='something')  
# or
shop_list = SearchQuerySet().filter(content='shop_username')  
# Now (let's supose there is at least 1 shop) you can get the items like:    
shop_list[0].object  # This returns the shop object, so you can do
shop_list[0].object.item_set.all()  # This returns all items belonging to this shop

在您的模板中,您可以尝试:

{{ object.object.item_set.all }}  # This return a list of items belonging to shop

您可以生成这样的列表

<ul>
{% for item in object.object.item_set.all %}
     <li>{{item}}</li>
{% endfor %}
</ul>

这可能会造成混淆,因为您将对象调用到变量中,但您需要记住 SearchQuerySet 实例总是有这个 object 字段来访问原始 Django 对象

我建议你检查Haystack - SearchQuerySet API


编辑

在您的模板中,您的结果位于变量 items 中,因此您可以执行以下操作:

# Assumming all the items are shops
{% for shop in items %}  
   {{shop.object.item_set}}  # If the item is a SHop, this return all its items
{% endfor %}

为了分离结果,因为我假设不是所有的项目都是商店,你可以分离结果并将商店在另一个变量中发送到模板,如:

def search(request):
    form = ItemSearchForm(request.GET)
    results = form.search()
    return render(request, 'search/search.html', {
        'items': results
        'shops': results.model(Shop)
    })

所以在你的模板中你可以这样做:

{% for shop in shops %}  
   {{shop.object.item_set}} 
{% endfor %}

编辑2

好的,现在看起来您的模板中有商品...并且您想要商店的所有商品?

  • 哪家店?与模板中的商品相同的商店?

你说:

但是,如果有人包含该商店的用户名或简历,我如何显示属于该商店的所有商品?

所以您正在使用 haystack 搜索商品,但希望结果是商店?

您可以添加到您的 item_text.txt 文件中:

{{ object.tags}}
# If you add this and you look for shop username 
# or bio it will return all items of the shop
{{ object.shop.username}} 
{{ object.shop.bio}} 
# Adding this 2 fields items are indexed with the related shop username and bio

或者您也可以开始索引 Shop 模型。

【讨论】:

  • 你的问题是正确的。在命令行中它工作正常。但是我无法在我的代码中执行此操作:( 非常沮丧。我在我的模板中尝试了这个:{{ object.object.item_set.all }}。没有帮助
  • 您能说明如何将结果发送到模板吗?您的视图和模板的一些代码?因为如果它适用于 shell,它也应该适用于模板(我在我的项目中使用它)。你在 {{object}} 有什么?
  • items 不是 Shop 模型。它们属于 Item 模型。
  • 所以?你需要做 item.shop.item_set... 你有你需要的所有逻辑......我无法为你编写和重写确切的代码......你知道 object 之间的外键关系吗?我误会了你在找商店……
  • 对不起我的英语。我只想要物品。当人们搜索项目时,我想显示这些项目。但是当他们搜索商店时,我想显示这些商店的商品
猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 2014-09-25
  • 2015-03-29
  • 2013-02-12
  • 2012-12-29
  • 1970-01-01
  • 2017-02-04
  • 2011-03-26
相关资源
最近更新 更多