Django/python:遍历字典并向其添加项

1 投票
2 回答
1029 浏览
提问于 2025-04-16 18:16

抱歉问了一个可能很简单的问题,我看过文档但还是搞不定。

我在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()

撰写回答