【问题标题】:custom field ordering in django admindjango admin中的自定义字段排序
【发布时间】: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 感谢您的建议。

标签: python django


【解决方案1】:

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

没有充分的理由在 Python 中进行这种排序。您应该将其添加到 ORM 调用中:

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

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

【讨论】:

  • 感谢您的即时回复,是的,我在做愚蠢的事情。但是我真的很想要这个sorted(qs, key=key=lambda item: socket.inet_aton(item)),有可能吗?
猜你喜欢
  • 2022-10-05
  • 2014-06-10
  • 2021-05-18
  • 2020-12-28
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 2021-08-19
相关资源
最近更新 更多