Django Admin中自定义字段排序
我在使用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
属性。