【问题标题】:django "<QuerySet{[ ]}" appearing in listdjango "<QuerySet{[ ]}" 出现在列表中
【发布时间】:2019-02-26 03:42:54
【问题描述】:

我一直在努力解决一些我认为是我的愚蠢疏忽的事情。我有一个表单,它将输入提供给一个视图,该视图查询我拥有的一些 SQL 表并返回一个列表,其中包含每个表中的列**。

发生的奇怪事情是我的列表出现在

<QuerySet{[ ]}>

每个列表对象周围的括号。谁能告诉我如何避免这种情况?

非常感谢。

**我正在使用此列表而不是 ForeignKeys 来组合这些表,因为我在使用 SQLAlchemy 和 Postgres 正确填充我的 SQL 数据库时遇到了很糟糕的情况,并且读到存在已知问题,所以我放弃了那个方法。

views.py

 from django.shortcuts import render, get_object_or_404
    from django.http import HttpResponseRedirect, HttpResponse, Http404
    from django.views import generic
    from django.views.generic.edit import CreateView, UpdateView, DeleteView
    from django.urls import reverse_lazy
    from .models import *
    from .forms import QuoteForm, RfqForm

    def bom_result(request):
        if request.method == 'POST':
            form = RfqForm(request.POST)
            if form.is_valid():
                bom_list = []

                rfq = {}
                rfq_search = form.cleaned_data['rfq_entered']
                rfq['rfq_num'] = rfq_search
                rfq['bom'] = Quotereq.objects.values('bom_entered').filter(rfq_num__exact=rfq_search)
                rfq['part_num'] = Bom.objects.values('partnum').filter(bom__exact='07-00-000019')
                bom_list.append(rfq)

                context = {'bom_list': bom_list}
                return render(request, 'quote/result.html', context)
            else:
                return HttpResponse("<h1>Something Went Wrong</h1>")
        else:
            form = RfqForm()
            context = {'form': form}
            return render(request, 'quote/lookup.html', context)

结果.html

{% extends "base.html" %}
{% load static %}

{% block title %}{{title}}{% endblock title %}

{% block sidenav %}
    {% for page in page_list %}
    <li>
        <a href="{{page.permalink}}">{{page.title}}</a>
    </li>
    {% endfor %}
{% endblock sidenav %}
{% block content %}
{% autoescape off %}
{{ content }}
{% endautoescape %}

{% if bom_list %}
{% for bom in bom_list %}

<table>
    <tr>
        <th><h1>RFQ Number</h1></th>
        <th><h1>BOM</h1></th>
    </tr>
    <tr>
        <td>


            <ul style="list-style-type:none">
                <li>{{ bom.rfq_num }}</li>
            </ul>
        </td>
        <td>
            <ul style="list-style-type:none">
                <li>{{ bom.bom }}</li>
            </ul>
        </td>
        <td>
            <ul style="list-style-type:none">
                <li>{{ bom.part_num }}</li>
            </ul>
        </td>
    </tr>
</table>
{% endfor %}
{% else %}
    <p>No Matching RFQ in Database</p>
{% endif %}

{% endblock content %}

这是表格输出的内容:

【问题讨论】:

  • 好吧,partnum 会产生 multiple 结果和 QuerySet,所以如果你想显示这些元素,你需要 iterate在模板中覆盖它,并渲染各个元素。
  • 但是不使用ForeignKeys最终只会导致更多麻烦。
  • 但是你不需要给它们下标,你用{% for part in bom.part_num %} {{ part }} {% endfor %}迭代。
  • 啊,是的,你需要提取它,用{% for part in bom.part_num %} {{ part.partnum }} {% endfor %},所以在渲染元素的变量中添加一个.partnum
  • 谢谢你,Willem,你帮助了我好几次。如果您在答案中发布,我会标记它是正确的,以便您获得应得的分数。

标签: python sql django postgresql


【解决方案1】:

如果我们查看part_num 是什么,我们会看到:

rfq['part_num'] = Bom.objects.values('partnum').filter(bom__exact='07-00-000019')

这是一个QuerySetQuerySet 是某种产生一组对象的查询。您可以使用 Django ORM(您在此处执行的操作)构造这样的 QuerySets。

为了获取QuerySet 中的元素,您可以遍历元素,例如单独处理这些元素。

在模板中我们可以例如写:

<td>
    <ul style="list-style-type:none">
        <li>{% for part in bom.part_num %} {{ part.part_num }} {% endfor %}</li>
    </ul>
</td>

所以我们遍历QuerySet,然后我们每次都得到一个字典(被包裹在QuerySet中,我们在字典中渲染与'part_num'键对应的值。当然我们可以使其更复杂(例如使用 HTML 标记指令,如 {% for part in bom.part_num %} &lt;b&gt;{{ part.part_num }}&lt;/b&gt; {% endfor %} 将其以粗体显示。

我使用此列表而不是 ForeignKeys 来组合这些表,因为我很难让我的 SQL 数据库使用 SQLAlchemy 和 Postgres 正确填充,并且读到存在已知问题,所以我放弃了该方法.

我真的建议使用ForeignKeys、ManyToManyFields 等来表示实体之间的关系。 Django 不仅允许您进行更具表现力的查询,它还将向数据库添加约束,以便与 ForeignKey 对应的列将始终指向它们所指向的表的主键,等等。如果您例如删除引用的实体,您可以定义触发器要做什么(删除相关对象,将外键 columnn 设置为NULL 等)。也许关注Django tutorial 可以提供一些必要的信息以继续。

当然,你可以按照自己喜欢的方式设计和实施项目,但我个人的经验是,最终可能会导致更多麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 2020-01-01
    • 2013-02-28
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2020-08-24
    相关资源
    最近更新 更多