【发布时间】:2014-05-29 09:58:48
【问题描述】:
我在 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.
但是对象列表会打印在终端上。为什么我会遇到这个问题?
【问题讨论】:
-
返回列表而不是查询集的坏习惯。调用
sorted函数后,qs不再是查询集。你得到的错误很奇怪。无论如何,你的代码不应该像你期望的那样工作,因为 django admin 试图应用filter函数来返回它从models.Manager.get_query_set()获得的值。您要进行哪种排序?为什么不使用qs = qs.order_by('id')而不是注释行? -
感谢您的即时回复,是的,我在做愚蠢的事情。但是我真的很想要这个
sorted(qs, key=key=lambda item: socket.inet_aton(item)),有可能吗? -
即使你能做到这一点,也确实是不正常的解决方案。
-
但是,如果此顺序非常重要,您可以创建附加列并将 ip 以 32 位格式整数存储在那里。然后只需在模型的
post_save上绑定信号,以便稍后动态填充该字段。解决方案是愚蠢的。但如果你真的需要它应该会有所帮助。 -
@KirillKartashov 感谢您的建议。