【问题标题】:Django - admin_order_field with custom non-related objectDjango - 具有自定义非相关对象的 admin_order_field
【发布时间】:2014-11-29 06:07:57
【问题描述】:

如何在具有相反关系的方法中使用 admin_order_field?

是否可以使用一些聚合查询集功能?

class Card(models.Model):
    serial_number = models.CharField(max_length=200)
    ...

class License(models.Model):
    expiration = models.DateTimeField('Expiration')
    card = models.ForeignKey('Card')
    ...

class Pc(models.Model):
    card = models.ForeignKey('Card')
    ...

class PcAdmin(admin.ModelAdmin):
    ...

    def expiration(self, obj):
        try:
            license = License.objects.get(card=obj.card, type="xxx")
            expiration = license.expiration

        except (License.DoesNotExist, TypeError):
            expiration = "N/A"

        return expiration
    expiration.short_description = _("Expiration")
    expiration.admin_order_field = ???

【问题讨论】:

  • 你想使用什么样的聚合查询集函数?
  • 聚合排序查询集,但重点是,我想在 PcAdmin 中订购自定义过期字段

标签: django django-models django-admin django-queryset


【解决方案1】:

基本上,如果您可以像做字段一样引用某些内容,则可以在admin_order_field中使用它。

所以,如果您想通过 Card's serial_number 订购,您可以说 `admin_order_field = 'card__serial_number'。

或者,如果你想使用注解,你可以先定义一个创建注解的get_queryset() 方法;然后使用新的注释名称作为您的admin_order_field

但在你的情况下,你不能这样做。问题是对type="xxx" 的限制;无法使用字段表示法来表示该逻辑。

不过,可以使用extra() 来定义包含所需信息的自定义字段,然后将其用作admin_order_field

【讨论】:

  • 有没有办法在不编辑数据库模型的情况下做到这一点?像创建一个属性来存储排序的查询集,然后在 admin_order_field 中使用它?
  • @Niorko:我不这么认为。排序是在数据库级别完成的,所以我认为使用属性不会起作用。
  • 谨慎使用上述extra()。 Django 文档声明它计划在未来的版本中弃用它。
猜你喜欢
  • 2017-05-21
  • 1970-01-01
  • 2020-07-23
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多