如何在django admin中对不存在的字段进行排序/排序[重复]

Posted

技术标签:

【中文标题】如何在django admin中对不存在的字段进行排序/排序[重复]【英文标题】:How to sort/order on non-existent field in django admin [duplicate] 【发布时间】:2016-04-21 08:07:29 【问题描述】:

如何在 django admin 中对不存在的字段进行排序。 基本上我有服务器和应用程序模型以及链接它们的第三个关系模型。 我看到了您的回复,但不确定将您提到的代码放在哪里。 这是模型和admin.py

# Model.py File
class Server(models.Model):
name = models.CharField(max_length=100,  unique=True)
operating_system = models.CharField(max_length=20, choices=constants.OPERATING_SYSTEMS.items())

@property
def number_of_apps(self):
    return ServerApplicationRelationship.objects.filter(server=self).count()

class Application(models.Model):
    name = models.CharField(max_length=100,  unique=True)
hosted_on = models.ManyToManyField(Server, through='ServerApplicationRelationship', blank=True,)

@property
def number_of_servers(self):
    return ServerApplicationRelationship.objects.filter(app=self).count()
# number_of_servers.server_field = 'server__count'

class ServerApplicationRelationship(models.Model):
    server = models.ForeignKey(Server, blank=True, )
    # server_tag = models.ForeignKey(Server, through_fields= 'tags')
    app = models.ForeignKey(Application, blank=True)

# Admin.py file
@admin.register(Application)
class ApplicationAdmin(admin.ModelAdmin):


    inlines = [ApplicationInLine]
    list_display = ['name', 'number_of_servers']
    list_display_links = ['name', 'number_of_servers']

    ordering = ('number_of_servers', 'name')

@property
def number_of_apps(self):
    queryset = ServerAppRelation.objects.filter(server=self).count()
    return queryset

如果我在ordering 中包含number_of_servers。我收到一个错误

    ERRORS:
<class 'S5.admin.ApplicationAdmin'>: (admin.E033) The value of 'ordering[0]' refers to 'number_of_server', which is not an attribute of 'S5.Appl
ication'

number_of_server 在表中显示为列,但不可排序。 如何使其可排序?

非常感谢

【问题讨论】:

***.com/questions/2647632/… @Brandon 重复的目标已经有好几年了,而且有点过时了。现在正确的做法是使用annotate 而不是extra 好的,我重新打开了。 请参阅上面的详细信息。不知道如何修改代码以使其可排序。 @Alasdair,您能否提供一个基于注释的示例代码,说明您将如何使用它? 【参考方案1】:

首先,您需要重写get_queryset 方法,并用服务器数量对其进行注释。

很遗憾,您不能在 list_display 中包含带注释的字段,因为它无法通过 Django 系统检查。因此,您定义了一个返回带注释字段的方法,并将该方法包含在 list_display 中。

最后,要使列可排序,您需要在方法上设置admin_order_field 属性。

@admin.register(Application)
class ApplicationAdmin(admin.ModelAdmin):
    list_display = ['name', '_num_servers']

    def _num_servers(self, obj):
        return obj.num_servers
    _num_servers.admin_order_field = 'num_servers'

    def get_queryset(self, request):
        return super(AppAdmin, self).get_queryset(
            request,
        ).annotate(num_servers=Count('servers'))

【讨论】:

以上是关于如何在django admin中对不存在的字段进行排序/排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django admin change_form 中实现 pygment 语法高亮?

django - 根据翻译后的名称在管理 ui 中对模型进行排序

在 Django Admin 中创建自定义显示字段(models.py 中不存在)

Django框架之admin管理后台

Django-admin按多个字段排序

Django admin - 在显示的用户列表中添加一个字段