unicode'对象没有'value1'属性

3 投票
2 回答
6013 浏览
提问于 2025-04-16 16:02

如果我在views.py里有一个对象列表,比如:

myobjects=model.objects.all()

然后我获取这些对象某个字段的值:

times=myobjects.values_list(‘time’, flat=True)

接着我想给这个列表里的每个对象设置一个属性,叫做times:

for mytime in times:
    mytime.value1=myobjects.filter(time=mytime).values_list(‘value1’,flat=true)
    mytime.value2=myobjects.filter(time=mytime).values_list(‘value2’,flat=true)

然后在模板的html文件中使用这个属性:

{%for mytime in times%}
<tr><td>{{mytime.value1}}</td><td>{{mytime.value2}}</td></tr>
{%endfor%}

但是我遇到了一个错误:'unicode'对象没有'value1'这个属性……(注意:当然还有'value2')。我是不是做错了什么,导致无法给对象mytime设置属性?我以为用object.attribute=value就可以设置属性了。谢谢。

解决方案:我用下面的代码解决了我的问题:

objects=model.objects.all()
objects2=objects.filter(type=types[0]) # types is a list i got from user. the codes is used because i want limit type to only one type so that i could get unrepetitive time list later.
timelist=objects2.order_by('time').values('time','date','date_time','anyotherfield')
for mytime in timelist:
    time=objects.filter(time=mytime['time']).values_list('time',flat=True)[0]
    date=objects.filter(time=mytime['date']).values_list('date',flat=True)[0]
    date_time=objects.filter(time=mytime['date_time']).values_list('date_time',
    flat=True)[0]
    myobjects=objects.filter(time=mytime['time']) #to get all objects on each time
    mytime.update({'anyotherfield':myobjects,'date_time':date_time,
    'date':date,'time':time})
return render_to_response('report.html',locals())

在html页面中,我写:

{%for mytime in timelist%}
<tr>
    <td>{{mytime.date_time}}</td>
    <td>{{mytime.date}}</td>
    <td>{{mytime.time}}</td>

    {%for object in mytime.anyotherfield%}
    <td>{{object.value1}}</td>
    <td>{{object.value1}}</td>
    {%endfor%}
</tr>
{%endfor%}

这样我就能为每个不同的时间('date_time')获取一行数据,并在每一行中显示时间信息(每个时间字段只有一条信息)以及在那个特定时间不同对象的具体字段值。

2 个回答

1

我想知道为什么你要把一个扁平化的查询集(values_list)传给模板呢?

正如Brandon提到的,如果你把数据放在一个字典里会更好:

myobjects=model.objects.all()
times=myobjects.values_list(‘time’, flat=True)

time_info = {}

for mytime in times:
    time_info[mytime] = myobjects.filter(time=mytime)

然后在你的模板中:

{% for time, myobjects in time_info.items %}
<h1>{{ time }}</h1>
<ul>
{% for myobject in myobjects %} 
    <li>{{ myobject.value }}</li> 
{% endfor %}
</ul>
{% endfor %}
3

myobjects.values_list() 返回的是一个包含 Unicode 值的列表,而不是对象。如果你想把这些值和你的查询集中的其他值结合起来,可能可以考虑返回一个字典,而不是仅仅返回值列表...

times = myobjects.values('time')

for mytime in times:
    mytime.update({'my_key' : myobjects.filter(time=mytime).values_list('value1',flat=true)})

希望这对你有帮助。

撰写回答