在我的views.py中,这是我的代码:
def search(request):
qset = Q()
query = request.GET.get('q', '')
queryC = request.GET.get('clients', '')
queryD = request.GET.get('documents', '')
queryT = request.GET.get('topics', '')
if query:
newquery = stopwords.strip_stopwords(query)
terms = newquery.split()
if queryT != 'empty':
for term in terms:
qset |= (
Q(Topic_id__Name__icontains=queryT) &
Q(Question_id__Statement__icontains=term)
)
results = Response.objects.filter(qset).distinct()
else:
for term in terms:
qset &= (
Q(Question_id__Statement__icontains=term)
)
results = Response.objects.filter(qset).distinct()
else:
results = []
return render_to_response("app/search.html", {
"results": results,
"query": query
})
models.py:
class Question(models.Model):
Topic_id = models.ForeignKey(Topic, on_delete=models.CASCADE)
Statement = models.CharField(max_length=255, default='Question')
Keyword = models.CharField(max_length=255, default='Keyword')
def __str__(self):
return self.Statement
class Response(models.Model):
Question_id = models.ForeignKey(Question, on_delete=models.CASCADE)
Topic_id = models.ForeignKey(Topic, on_delete=models.CASCADE)
Response = models.TextField(default='Response')
def __str__(self):
return self.Response
它从用户输入中返回与查询紧密相关的响应。但我也希望它返回与响应链接的问题。
我的答复表具有到由Questions_id链接的问题表的外键。我读过我可能不得不使用select_related(),但不确定如何使用。
答案 0 :(得分:0)
您有一个“响应”查询集。在模板中进行迭代时,您可以使用外键来解决相关问题:
{% for response in results %}
{{ response.Response }}
{{ response.Question_id.Statement }}
{% endfor %}
在这里,select_related的使用是一种优化,因为它将以JOIN的形式获得相关的问题,而不是进行单独的查询。不需要 (并且从不)。但这是个好主意。
results = Response.objects.filter(qset).select_related('Question_id').distinct()
几个风格要点。对于属性名称,使用小写字母是statement
,keyword
等,这是Pythonic的。更重要的是,您不应该将_id
用作ForeignKey字段。尽管有名称,但字段本身实际上并不是id,因为它们可以访问整个相关对象(如上所示)。因此,您应该将它们称为question
,topic
等。