django admin中的自定义字段排序

时间:2014-05-29 09:58:48

标签: python django

我在django admin中遇到自定义字段的奇怪问题,这里我正在尝试使用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 个答案:

答案 0 :(得分:1)

通过使用sorted,您将查询集转换为列表。但get_query_set必须返回一个查询集,因此名称:对该管理器返回的值进行操作的任何内容都将需要QS。

在Python中没有充分的理由这样做。您应该将其添加到ORM调用:

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

甚至更好,在模型的Meta类中设置ordering属性。