如何在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 中对模型进行排序