Django Admin中自定义字段排序

0 投票
1 回答
2182 浏览
提问于 2025-04-18 07:55

我在使用Django后台管理时遇到了一个奇怪的问题。我想通过Django的模型管理器来对自定义字段进行排序。

class PracticeManager(models.Manager):
    def get_query_set(self, ):
        qs = super(PracticeManager, self).get_query_set().all()
        # qs = sorted(qs, key=operator.attrgetter('id'))
        print qs
        return qs

class Practice(models.Model):
    """docstring for Practice"""
    name = models.CharField(max_length=20, verbose_name='Name')
    ip = models.IPAddressField(verbose_name="Ip Address")
    objects = PracticeManager()

    def number_of_orders(self):
        return u'%s' % self
    number_of_orders.admin_order_field = 'ip' 

admin.py:

class PracticeAdmin(admin.ModelAdmin):
      list_display = ('number_of_orders', 'name')

上面的代码运行得很好,能在终端打印出对象的列表,Django后台也正常工作。

[<Practice: 10.90.90.1>, <Practice: 10.90.90.13>, <Practice: 9.5.3.2>, <Practice: 10.90.90.11>]

但是当我启用下面这一行时,

qs = sorted(qs, key=operator.attrgetter('id'))

后台面板就出现了奇怪的错误,

Database error
Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user.

不过对象列表在终端中还是能打印出来。为什么会出现这个问题呢?

1 个回答

1

使用 sorted 的时候,你其实是把查询结果转换成了一个列表。但 get_query_set 这个函数应该返回一个查询集,这也是它名字的意思:任何对这个管理器返回的值进行操作的东西,都会期待得到一个查询集。

在Python中进行排序其实没有太大必要。你应该把排序的操作放到ORM调用里:

qs = super(PracticeManager, self).get_query_set().order_by('id')

或者更好的办法是,在模型的Meta类中设置 ordering 属性。

撰写回答