我在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.
但是对象列表在终端上打印。为什么我要面对这个问题?
答案 0 :(得分:1)
通过使用sorted
,您将查询集转换为列表。但get_query_set
必须返回一个查询集,因此名称:对该管理器返回的值进行操作的任何内容都将需要QS。
在Python中没有充分的理由这样做。您应该将其添加到ORM调用:
qs = super(PracticeManager, self).get_query_set().order_by('id')
甚至更好,在模型的Meta类中设置ordering
属性。