【问题标题】:Order by related object attribute in Django/Python在 Django/Python 中按相关对象属性排序
【发布时间】:2011-12-05 07:56:00
【问题描述】:

我有一个名为Module 的静态对象。 Module 对象的属性之一是'name'。我有一个名为Section 的数据库表,它将模块键保存在一个列中。

我想从该表中获取对象并按与它们相关的模块的名称进行排序。

大多数时候,当我引用 Module 对象时,它是这样的:section.module.module_object.name

型号是:

class Section(models.Model):
    page = models.ForeignKey(Page)
    module = models.CharField(db_index=True, max_length=50, choices=[(k, '%s %s' % (s.service, s.name)) for k, s in MODULES.iteritems()])

我试过了:

navigation_links = sorted(navigation_links.values(), key=lambda m: m['module'].module_object.name)

但我收到错误AttributeError: 'unicode' object has no attribute 'module_object'

更新:这是模块对象:

class Module(object):

    def __init__(self, key, name):
        self.key = key
        self.name = name

# ... list of a lot of ALL_MODULES

#dict of the above list
MODULES = dict([(s.key, s) for s in ALL_MODULES])

【问题讨论】:

  • @DrTyrsa - 我想从该表中获取对象并按与它们相关的模块的名称进行排序。但是这两种方法给了我错误。
  • module 字段只是一个字符串。您需要以某种方式检索您的对象。当然你不能在数据库级别做到这一点。
  • @DrTyrsa 所以看来我需要从数据库中获取它们,然后按 module_object 的属性进行排序。这就是我不知道该怎么做。
  • 您要完成什么任务?为什么你需要使用一些对象而不是普通的 Django 模型。对象的目的是什么?它有什么接口?

标签: python django sorting django-queryset


【解决方案1】:

从您的代码中,我推断MODULES 是您的模块对象的字典,按它们在数据库中保存的值进行索引。这些对象具有name 属性,因此如果您修改示例以通过保存的名称从该字典中获取对象,您应该得到您需要的:

navigation_links = sorted(navigation_links.values(), 
                          key=lambda m: MODULES[m['module']].name)

当然,这一切都是基于我对您的代码的猜测。如果这不起作用,请提供有关sectionmodule_object 变量的更多信息。

【讨论】:

  • 谢谢。抱歉信息不足。 MODULES 是静态对象的字典,与数据库无关。我在上面添加了那个结构。然后,Section 引用了 Module Object 的键。
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多