如何从模型中获取字段数据?

0 投票
2 回答
3522 浏览
提问于 2025-04-16 15:15

假设我有一个叫做app的Django应用。在这个应用里,我在models.py文件中定义了一个模型类,叫做data。同时,我在模板目录下有一个html文件,里面有几个下拉列表,这些下拉列表应该用模型中的字段来填充,比如类型(type)、日期(date)。

我需要做的是在views.py文件中获取这些字段的列表,并用它们来填充下拉列表。还有一点是,当用户通过选择下拉列表中的值来提交查询后,我会展示一个表格,显示模型中所有字段的值。所以基本上,我需要获取用户输入的内容,根据这个输入进行查询,然后根据查询结果获取模型中所有字段的数据。我们可以再加两个字段,时间(time)和数值(value)。这些操作大部分都应该在views.py中完成。

这是html文件中的下拉列表:

 <form action="" method="post">
 <select name="type" values="type_data"></select>
 <select name="date" values="date_data"></select>
 <input type="submit" value="Submit">
 </form>

我尝试做的两件事是:

1. 为了获取数据来填充下拉列表,我使用了:

objects= data.objects.all()
type_data=getattr(objects, 'type')
date_data=getattr(objects, 'date')

2. 为了在查询后获取数据,我使用了:

if request.method == 'POST':
     …
    mytype =  '% r' % request.POST.get['type']
   mydate = ' %r ' % request.POST.get['date']
   objects2= data.objects2.filter(type=mytype,date=mydate)
   time=getattr(objects2, 'time')
   value=getattr(objects2, 'value')

但是这些都没有成功。我参考了这个链接 django object get/set field,所以我基本上是用这个方法来获取模型字段的数据:getattr(obj, 'field_name')

有什么想法吗?我非常感谢任何帮助。

2 个回答

1

你的 objects 变量是一个查询集,简单来说就是一堆对象的集合。当你把它变成“具体的东西”时,就变成了一份对象列表。所以,如果你想获取这些对象的属性,就需要逐个遍历它们:

objects = data.objects.all()

type_data = []
date_date = []

for obj in objects:
    type_data.append(obj.type)
    date_date.append(obj.date)

不过我想你真正需要的是为下拉框中的每个值准备一个ID(但我可能错了):

for obj in objects:
    type_data.append((obj.pk, obj.type))
    date_date.append((obj.pk, obj.date))

这样会创建一个包含多个元组的列表:

[(1, 'value1'), (2, 'value2')...]

所以在模板中你可以使用:

<select name="type">
    {% for value, name in type_data %}
        <option value="{{ value }}">{{ name }}</option>
    {% endfor %}
</select>

不过要记住,Django可以简化这个过程——可以了解一下表单的相关内容。

1

看看 Django的表单 功能,特别是 ModelChoiceField,它可以解决这个问题。

如果你想查看一个模型里有哪些字段,可以看看 model._meta.fields

比如,下面的代码会打印出模型实例 instance 中每个字段的值:

for field in instance._meta.fields:
    print field.attname, '=', getattr(model, field.attname)

撰写回答