我的网站上有搜索表。当用户键入查询(如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”时:
我不知道如何同时处理两个表。
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
方法来获取结果数。