【问题标题】:'unicode' object has no attribute 'value1'“unicode”对象没有属性“value1”
【发布时间】:2011-04-19 14:37:09
【问题描述】:

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

myobjects=model.objects.all()

然后我得到对象字段的值:

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

然后我想为列表时间的每个对象设置属性:

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' object has no attribute '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')获取一行,并在每一行中显示时间信息(每个时间字段只有一个)以及该特定对象上不同对象的特定字段值时间。

【问题讨论】:

    标签: python django object attributes


    【解决方案1】:

    myobjects.values_list() 返回一个 unicode 值列表,而不是对象。如果您需要使用查询集中的值来增加值,您可以考虑返回值字典而不是 values_list...

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

    希望对你有所帮助。

    【讨论】:

    • 现在它给了我“ValuesQuerySet”对象没有属性“iteritems”。 objects.values() 或 .iteritems() 有什么问题吗?
    • 仍然,它说:“ValuesQuerySet”对象没有属性“items”。也许它不需要 .items()?
    • 我相信你是对的:docs.djangoproject.com/en/1.3/ref/models/querysets/#values 我需要更多的咖啡 :)
    • 应该能够根据需要向字典中添加任意数量的值,而不会破坏循环。
    【解决方案2】:

    我想知道您为什么将扁平化查询集 (values_list) 传递给模板?

    正如布兰登所说,如果将数据放入字典中会更好:

    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 %}
    

    【讨论】:

    • 我添加了问题的解决方案,你现在可以知道为什么我必须使用 values_list
    猜你喜欢
    • 2013-12-28
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2016-01-05
    相关资源
    最近更新 更多