【问题标题】:Django/python: loop through a dictionary and add an item to itDjango/python:遍历字典并向其中添加项目
【发布时间】:2011-05-24 19:52:19
【问题描述】:

对于可能很简单的问题,我已经阅读了文档,但仍然无法正常工作。

我在 Django 中创建了一个很长的原始 SQL 查询,所以我不会在这里发布它 - 只要说它可以工作并返回结果就足够了。

我想遍历我的查询结果并检查乐队名称的格式是否为“The [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 字段添加到字典中,以便我可以在我的视图中访问它。

谁能帮帮我?

【问题讨论】:

    标签: python django dictionary


    【解决方案1】:

    首先,避免使用原始 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()
    

    【讨论】:

    • 原始 SQL 主要是由于 Django 为我的列表中的每个项目进行了大量额外的数据库调用,尽管 select_related() 和其他调整 - 在这里关于它的长线程:stackoverflow.com/questions/6037312/… - 至于view 选项 - 抱歉,我不太明白 - cleanup() 函数在哪里定义?
    • @Matt Andrews。 “cleanup() 函数在哪里定义?”不明白这个问题。任何地方。与视图功能相同的模块是众多选择之一。从整体应用来看,什么似乎有意义?
    • @Matt Andrews。相关问题似乎是关于原始 SQL 优点的辩论,而没有衡量避免原始 SQL 的实际 ORM 替代方案的性能。我不确定这是否有帮助,因为这一切都基于(未测量的)原始更快的假设。
    • 明白了,感谢您的澄清。至于原始 SQL,我将通过数据库查询的绝对数量来衡量:1 对 n*3(对于 100 多个项目的列表)。
    • @Matt Andrews。不要计算请求。测量时间。由于缓存的原因,查询的数量除了网络流量之外并不能很好地指示任何东西。还。稍加注意,您也许可以简化 Django ORM 处理。
    【解决方案2】:

    我假设您提到原始查询有充分的理由。没关系,也许您可​​以为每次交互实例化一个 Media 对象,加载您的 PK 并设置您的值并运行 .save()?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 2012-07-01
      相关资源
      最近更新 更多