【问题标题】:Django: how to get a model's keysDjango:如何获取模型的密钥
【发布时间】:2013-10-14 05:14:06
【问题描述】:

所以我正在尝试进入 Python 和 Django 的世界。来自 PHP,很多事情都是相似的,但我很难弄清楚如何执行以下操作。

在 PHP 中我会这样做:

$q = $this->db->query('SELECT * FROM data');

foreach ($q->result_array() as $key => $value) {
    switch ($key) {
        [...]
    }
}

现在,我的问题是:如何在 Django / Python 中完成类似的事情? 我有这个设置:

from index.models import Foo

def index(request):
    datalist = Foo.objects.get(id=1)

然后呢?

【问题讨论】:

  • 具体用例是什么?
  • 不确定sn-p 应该在PHP 中实现什么——迭代id => object 对?还是遍历结果集中所有对象的所有 key => value 对?
  • 顺便说一句,您在代码中使用了大量的空格——这确实对其可读性产生了不利影响。
  • 你也可以datalist.__dict__

标签: php python django


【解决方案1】:

注意: PHP sn-p 中的查询甚至与 Django sn-p 中的查询都不匹配。 PHP 执行SELECT * FROM data,但Python 执行SELECT * FROM data WHERE id = 1,所以我将继续假设您打算使用Foo.objects.all() 而不是Foo.objects.get(id=1)。如果你没有,那么请解决你的问题,并简单地删除下面代码 sn-ps 的循环部分。此外,您应该为变量 datalist 找到一个更好的名称,如果它只包含一个项目而不是顾名思义的列表,这最初让我感到困惑。

您并没有真正清楚地描述您的目标是什么,但这里有一些可能符合您需求的选项:

for obj in datalist:
    print "%s => %s" % (obj.id, obj)

...或者如果你想遍历所有对象的所有键值对:

for obj in datalist:
    print "OBJECT %s" % obj.id
    for field in Foo._meta.fields:
        print "  %s => %s" % (field.name, getattr(obj, field.name)

...或者您可以使用 django.forms.models.model_to_dict 帮助器将对象转换为字典:

from django.forms.models import model_to_dict

for obj in datalist:
    print "OBJECT %s" % obj.id
    for key, value in model_to_dict(obj_as_dict).items():
        print "  %s => %s" % (key, value)

【讨论】:

  • 所以你的第一个和第二个解决方案给了我一个“对象不可迭代”。然而,第三个选项有效。非常感谢!
  • 该错误是由于datalist 不是可迭代的,尽管它的名字暗示它是。我在答案的开头添加了一条评论。
  • @DiederikvandenBurger:阅读 Erik 的说明以了解您收到 Object is not iterable 错误的原因,他清楚地解释了您的 django 查询将返回 one 结果,而不是列表结果。
  • 嗯,是的,所以它确实不是一个列表。对不起,令人困惑的 var 名称。如果我只想选择一个迭代,那么第三个选项是唯一可能的选项吗?
  • 它们也都适用于单个项目,只需按照注意中的说明删除循环并仅使用循环体。它只是程序代码而不是中文或任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2017-05-09
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多