我正在尝试使用“liczba_glosow”字段在 Django 管理面板中进行排序。问题在于模型本身在 Meta 方法中按“numer_na_liscie”排序,而管理员使用默认排序而不是“liczba_glosow”。我希望管理员仅使用 order_by("-_liczba_glosow") 并绕过默认值。我无法使用简单的 ordering="liczba_glosow" 因为该字段只是为了管理显示目的而创建的,它不是模型本身的一部分。
class KandydatDoSejmuAdmin(admin.ModelAdmin):
list_display = ("imie_nazwisko", "numer_na_liscie", "okreg_wyborczy", "komitet_wyborczy", "liczba_glosow")
raw_id_fields = ("okreg_wyborczy", "komitet_wyborczy")
list_filter = ("komitet_wyborczy__nazwa", "oddanyglos__kod_pocztowy__wojewodztwo", "okreg_wyborczy__nazwa",)
search_fields = (
"imie_nazwisko", "okreg_wyborczy__nazwa", "komitet_wyborczy__nazwa", "oddanyglos__kod_pocztowy__wojewodztwo")
list_per_page = 10
def liczba_glosow(self, obj):
return obj.oddanyglos_set.count()
liczba_glosow.admin_order_field = "_liczba_glosow"
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.annotate(
_liczba_glosow=Count("oddanyglos__kandydat")
).order_by("-_liczba_glosow")
根据 Django 文档:
设置排序以指定对象列表在 Django 管理视图中的排序方式。这应该是与模型排序参数格式相同的列表或元组。 如果未提供,Django 管理员将使用模型的默认排序。
根据上述规定,任何禁用默认排序(如 ordering=None、get_ordering() 返回 None 或空列表)的尝试都不起作用。
是否有一个选项可以覆盖管理面板中的默认排序而不干扰模型?我需要在应用程序的其他部分对模型进行默认排序,所以我宁愿保留它。
您可以将其设置为您的自定义订单:
class KandydatDoSejmuAdmin(admin.ModelAdmin):
list_display = (
'imie_nazwisko',
'numer_na_liscie',
'okreg_wyborczy',
'komitet_wyborczy',
'liczba_glosow',
)
raw_id_fields = ('okreg_wyborczy', 'komitet_wyborczy')
list_filter = (
'komitet_wyborczy__nazwa',
'oddanyglos__kod_pocztowy__wojewodztwo',
'okreg_wyborczy__nazwa',
)
search_fields = (
'imie_nazwisko',
'okreg_wyborczy__nazwa',
'komitet_wyborczy__nazwa',
'oddanyglos__kod_pocztowy__wojewodztwo',
)
list_per_page = 10
ordering = '-_liczba_glosow'
def liczba_glosow(self, obj):
return obj.oddanyglos_set.count()
liczba_glosow.admin_order_field = '_liczba_glosow'
def get_queryset(self, request):
return (
super()
.get_queryset(request)
.annotate(_liczba_glosow=Count('oddanyglos__kandydat'))
)
因此,我们在
get_queryset
中注入一个表达式,然后使用 .ordering
[Django-doc] 将其用作排序。