Django/python:遍历字典并向其添加项
抱歉问了一个可能很简单的问题,我看过文档但还是搞不定。
我在Django里写了一个很长的原始SQL查询,具体内容就不贴出来了——总之它能正常工作并返回结果。
我想遍历查询结果,检查乐队名称是否是“ The [乐队]”这种格式,然后把它改成“[乐队], The”。我知道可以通过SQL来实现这个,但对于很多行数据来说,性能不是很好。而且我在乐队模型里有一个函数可以这样排序,但在使用原始SQL查询时不能用。
这是我的代码:
m = Media.objects.raw('SELECT blah FROM foo')
for index, item in enumerate(m):
if item.bandname_alt:
if item.bandname_alt[:4] == 'The ':
m[index].bandname_sortable = item.bandname_alt[4:] + ', The'
我知道逻辑是对的,能找到正确的乐队,但就是不知道怎么把bandname_sortable
这个字段加到字典里,这样我才能在视图里访问它。
有没有人能帮我一下?
2 个回答
0
我猜你提到你有很好的理由使用原始查询。这没问题,也许你可以为每次循环创建一个Media对象,加载你的主键(PK),设置好你的值,然后运行一下.save()方法?
2
首先,尽量避免直接使用原始的SQL查询。通常情况下,这并不是必要的。不过,这个话题可以单独讨论。
你有两种方法来优化你的结果。
在模型中。如果你能找到避免使用原始SQL的方法,你可以很简单地在你的模型里添加一个属性来处理这个问题。
class Media( models.Model ):
@property
def clean_band_name( self ):
if self.bandname_alt[:4] == 'The ':
return self.bandname_alt[4:] + ', The'
else:
return self.bandname_alt
你可以使用 sorted( list(results), key=lambda x: x.clean_band_name() )
来进行排序。
在视图中。构建一个简单的元组列表或者命名元组列表来扩展你的结果。
data = [ (cleanup(item.bandname_alt), item) for item in m ]
因为数据是一个简单的序列,所以可以根据每个元组的第一个元素进行排序。
data.sort()