【问题标题】:Accessing query set object in django template在 django 模板中访问查询集对象
【发布时间】:2012-12-28 14:15:34
【问题描述】:

我有两个模型,分别命名为HumanAnimal。 Human 的主键是 Animal 模型中的外键。两者各有 3 列。人体模型有 c、e、r 列。动物模型有 l、i、p 列。我正在对 Human 模型运行 django 查询,就像这样。

result = Human.objects.filter().order_by('r')

result 是一个查询集对象。该对象从我的视图文件发送到 django 模板页面。在模板页面内,我循环通过 result 并显示列值。

现在我想做的是,我还想在 django 模板内的同一循环中获取 p 列(存在于 Animal 模型中)的值。我们如何在django模板页面中做到这一点。

在python文件中我可以这样做

for i in result:
    print i.animal_set.values()[0]['p']

但我想在模板页面中进行。

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:
    {% for record in result %}
        {{record.c}}, {{record.e}}, 
        {% for animal in record.animal_set|slice:":1" %}
            {{animal.p}}
        {% endfor %}
    {% endfor %}
    

    【讨论】:

    • 感谢阿米尔的快速回复。我想显示/访问人类表的 2 列和动物表的 1 列。我可以通过执行record.c轻松获取Human表的2列,但是如何在您提供的上述代码中获取/提取所有3(第一个表的2列和第二个表的1列)
    • 但是动物是多重的,还是你只想要第一个动物值?
    • 更新了答案,在我的示例中,我从第一个 Human 表中获取 ce,从 Animal 表中获取列 p。这是你想要的吗?
    • 人类和动物模型是一对多的关系。在 Animal 表中,它可以有 1 个 Human Id 的多条记录。但是当我查询 Human 模型时,我需要 Animal 模型的第 0 个索引记录。如果 Human 模型有 3 条记录,Animal 模型有 7 条记录,那么我只需要显示 3 条记录
    【解决方案2】:

    首先,我想提一下您的数据库架构似乎有问题。如果“c”、“e”、“r”等是列的真实名称 - 考虑重命名它们。其次,在您提供的示例 Python 代码中,没有捕获 IndexErrors。如果要获取第一个与 Human 对象相关的 Animal,最好在 Human 模型中创建一个 getter 方法:

    def get_first_animal(self):
      try:
        return self.animal_set[0]
      except IndexError:
        return None
    

    如果您需要显示模板中的所有动物,您可以尝试以下操作:

    {% for animal in human.animal_set.all %}
    {{ animal }}
    {% endfor %}
    

    给定的变量名称不同,但在您的情况下,最好重构代码。

    【讨论】:

    • :).. 不不,“c”、“e”、“r”不是真正的列名。
    猜你喜欢
    • 2023-03-07
    • 2021-02-07
    • 2018-09-26
    • 2020-01-07
    • 2013-01-16
    • 2018-06-06
    • 2016-12-18
    • 1970-01-01
    • 2011-06-05
    相关资源
    最近更新 更多