如何在Django中将每个搜索词存储到数据库中

问题描述 投票:0回答:1

我的网站上有搜索表。当用户键入查询(如iPhone)时,程序会将该关键字存储到名为“ SearchTerms”的数据库中,其中包含搜索该关键字的人数。

示例:

search_term: iPhone

search_count: 50

这意味着50个人在我的网站上搜索了“ iPhone”一词。我希望搜索词在存在的情况下进行更新,在不存在的情况下进行添加。

这是我试图做的:

models.py

class SearchTerms(models.Model):
  search_terms = models.CharField(max_length=255, blank=True, null=True)
  total_searches = models.IntegerField(default=0)
  updated_on = models.DateTimeField(auto_now_add=True)

  search_objects = SearchTermManager()

  class Meta:
    verbose_name_plural = "Search Terms"

  def __str__(self):
    return self.search_terms

views.py

class SearchView(ListView):
    template_name = 'search.html'
    paginate_by = 20
    count = 0

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['count'] = self.count or 0
        context['query'] = self.request.GET.get('q')
        return context

    def get_queryset(self):
        request = self.request
        query = request.GET.get('q', None)

        if query is not None:
            product_results = Product.objects.search(query)

            # combine querysets
            queryset_chain = chain(
                    product_results
            )        
            qs = sorted(queryset_chain, 
                        key=lambda instance: instance.pk, 
                        reverse=True)
            self.count = len(qs) # since qs is actually a list
            return qs
        return Product.objects.none() # just an empty queryset as default

还有一件事,就是我正在使用2张桌子。因此,当我在搜索表单中键入“ iPhone”时:

  1. iPhone一词将添加到“ SearchTerms”表中(或增加值(如果已存在)。
  2. 在“产品”表中搜索该词并显示结果。

我不知道如何同时处理两个表。

python django
1个回答
0
投票
get_or_create

[这里,我正在减少一些基于链接和排序的代码,可能您不需要它们,因为您可以使用class SearchView(ListView): template_name = 'search.html' paginate_by = 20 count = 0 queryset = Product.objects.none() def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) context['count'] = context.get('object_list').count() context['query'] = self.request.GET.get('q') return context def update_search_query(self, query): term, _ = SearchTerms.objects.get_or_create( defaults={'search_terms':query}, search_terms__iexact=query ) term.total_searches += 1 term.save() def get_queryset(self): request = self.request query = request.GET.get('q', None) if query: self.update_search_query(query) return Product.objects.search(query).order_by('-pk') return super().get_queryset() 对结果进行排序。然后,我还添加了用于计数的代码。在上下文中,您将从键order_by获取查询集,我正在使用object_list方法来获取结果数。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.