Câu trả lời của Lincoln B là cách phù hợp với tôi.
Lúc đầu, tôi muốn chỉ bình luận về giải pháp của mình, nhưng tôi thực sự thấy mình giải quyết một vấn đề hơi khác. Tôi đã có một lớp quản trị, mà tôi muốn "tùy chỉnh" theo nhu cầu của tôi - cụ thể là quản trị viên django-taggit
. Trong một trong những ứng dụng của tôi admin.py
, tôi nói thêm:
# sort tags by name in admin (count items also possible)
from taggit.admin import TagAdmin
TagAdmin.ordering = ["name"]
# make sortable on item_count:
# 1. function for lookup
def item_count(obj):
"""This takes the item_count from object: didn't work as model field."""
return obj.item_count # not needed: obj.taggit_taggeditem_items.count()
# 2. property in function - admin field name
item_count.admin_order_field = 'item_count'
# 3. queryset override, with count annotation
from django.db.models import Count
TagAdmin.queryset = lambda self, request: super(TagAdmin, self).queryset(request).annotate(item_count=Count('taggit_taggeditem_items'))
# 4. add to list display
TagAdmin.list_display = ["name", item_count]
Các quan sát thú vị đối với tôi là, tôi có thể không chỉ chú thích các queryset
, và thêm "item_count"
-list_display
- bởi vì không có phương pháp item_count
trong TagAdmin
, cũng không phải một phương thức hoặc trường trong lớp mô hình Tag
(chỉ trong số queryset
).
Nguồn
2013-05-28 09:59:03
Có cách nào để đặt cài đặt này làm phương thức đặt hàng mặc định không? ví dụ = ('artist_count'). Không cho tôi với trường không tồn tại. –
đừng quên thêm dòng này: từ nhập django.db.models Số – Ali
Cách đơn giản và gọn gàng nhất IMO nếu bạn chỉ cần đặt hàng cho trang quản trị (như OP đã nêu). Không cần phải thay đổi Trình quản lý mô hình sự kiện khi chỉ cần thay đổi quản trị viên – Patrick