如何迭代到 Django 关系一对多的列表

Posted

技术标签:

【中文标题】如何迭代到 Django 关系一对多的列表【英文标题】:How to iterate into a list on django relation one-to-many 【发布时间】:2016-06-05 22:16:58 【问题描述】:

我是这个论坛和 django 的新手。 我使用的是 Python 2.7 环境。

我有以下models.py:

class Categoria(models.Model):

    DEFAULT_CATHEGORY = 0
    nome = models.CharField(max_length=255, null=False, default='0')

    def __unicode__(self):
        return self.nome

class Produto(models.Model):

    nome = models.CharField(max_length=255, null=False)
    pontos_na_compra = models.DecimalField(decimal_places=4, max_digits=10, default=0)
    pontos_na_troca = models.DecimalField(decimal_places=4, max_digits=10, default=0)
    foto = models.ImageField(upload_to=get_image_path, blank=True, null=True)

    categoria = models.ForeignKey(
        Categoria,
        default=Categoria.DEFAULT_CATHEGORY
    )

    def __unicode__(self):
        return "%s, %s" % (self.nome, self.codigo_depara)

我想要这种关系:每个类别(cathegory)都有很多 Produto(产品)。在模型中是否正确? 我在 views.py 上没有任何与之相关的内容。

我想在 html 文件中做一些这样的代码:

 show CATEGORIA.nome 

    for each PRODUTO in LIST OF PRODUCTS IN CATEGORIA do:

       show PRODUTO.nome

       show PRODUTO.pontos_na_compra

       show PRODUTO.foto

    end-for 

我尝试使用

% if categorias %
  <ul id="flexisel">
  % for categoria in produto.categoria_set() %
    <li>
      # SHOW ALL HERE. HOW?
    </li>
  % endfor %
  </ul>
% else %
  <p id="flexise">
     Nenhum produto encontrado!
  </p>
% endif %

但是它没有找到 categoria_set() 方法并返回这个:

无法解析余数:来自“produto.categoria_set()”的“()”

请求方法:GET 请求网址:http://127.0.0.1:8000/ Django 版本:1.9.2 异常类型:TemplateSyntaxError 异常值:

无法解析余数:来自“produto.categoria_set()”的“()”

异常位置:/home/dsbonafe/.virtualenvs/bruno/local/lib/python2.7/site-packages/django/template/base.py 在解析中,第 516 行 Python 可执行文件:/home/dsbonafe/.virtualenvs/bruno/bin/python Python版本:2.7.6 Python 路径:

['/home/dsbonafe/Documentos/Projetos/Bruno Mercado/bruno/redewebsite', '/home/dsbonafe/.virtualenvs/bruno/lib/python2.7', '/home/dsbonafe/.virtualenvs/bruno/lib/python2.7/plat-x86_64-linux-gnu', '/home/dsbonafe/.virtualenvs/bruno/lib/python2.7/lib-tk', '/home/dsbonafe/.virtualenvs/bruno/lib/python2.7/lib-old', '/home/dsbonafe/.virtualenvs/bruno/lib/python2.7/lib-dynload', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/home/dsbonafe/.virtualenvs/bruno/local/lib/python2.7/site-packages', '/home/dsbonafe/.virtualenvs/bruno/lib/python2.7/site-packages']

服务器时间:Ter, 23 Fev 2016 20:55:39 +0000

有人可以帮助我吗?

非常感谢。

【问题讨论】:

我误读了你的问题。你似乎自相矛盾。在您的解释中,您说您希望一个类别拥有许多产品。在您的模板代码中,您进行查找:produto.categoria_set。那是相反的。你打算哪一个?你的模板代码错了吗?我可以更新我的答案。 其实我还没有看懂categoria_set。下面的答案,告诉我发生了什么。 【参考方案1】:

您的模型在我看来是正确的。我看到了几个潜在的问题。

    根据您的模板引擎,您可能必须删除括号。我认为 Jinja2 使用它们,但 Django 模板语言没有。我认为,根据错误消息,您使用的是后者(DTL)。

    您可能只需要在produto.categoria_set 上调用all 方法。我很确定categoria_set 是一种经理对象。你需要一个QuerySet,调用all时会返回。

您应该尝试以下方法:

% for categoria in produto.categoria_set.all %
# SHOW ALL HERE. HOW?
% endfor %

注意:这个答案目前在不断变化,因为原来的问题自相矛盾。

【讨论】:

以上是关于如何迭代到 Django 关系一对多的列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django 查询从一对多关系中获取数据

61.Django03

61.Django03

如何在greenDAO中设置一对多的关系?

如何借助一对多关系在 Django 中使用外键从课程中获取主题

Android ListView:如何避免bindView()中的数据库查询?需要获取一对多的关系数据