如何使用PostgreSQL从Django中的两个表中检索数据

时间:2018-07-26 08:12:25

标签: python html django postgresql

在我的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(),但不确定如何使用。

1 个答案:

答案 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()

几个风格要点。对于属性名称,使用小写字母是statementkeyword等,这是Pythonic的。更重要的是,您不应该将_id用作ForeignKey字段。尽管有名称,但字段本身实际上并不是id,因为它们可以访问整个相关对象(如上所示)。因此,您应该将它们称为questiontopic等。