对于可能简单的问题道歉,我已经阅读了文档但仍然无法使其正常工作。
我在Django中创建一个原始的SQL查询很长,所以我不会在这里发布 - 只需说它可以工作并返回结果就足够了。
我想遍历我的查询结果并检查带名是否为“[band]”格式并将其重写为“[band],The”。我知道我可以通过SQL做到这一点但是对于大量的行来说性能不是很好,而且我在band模型上有一个函数可以用这种方式排序,但不能在原始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
字段添加到字典中,以便我可以在我的视图中访问它。
有人可以帮助我吗?
答案 0 :(得分: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()
答案 1 :(得分:0)
我假设你提到你有充分的理由进行原始查询。那很好,也许你可以为每个交互实例化一个Media对象,加载你的PK并设置你的值并运行一个.save()?