2012-11-24 3 views
1

어떻게 정렬/주문 readonly_fields (https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields 참조)? 관리자에서Django admin : 정렬/정렬 동적 readonly_fields

class MyUserAdmin(UserAdmin): 
    readonly_fields = ('pinCount') 
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'is_active', 'date_joined', 'last_login', 'pinCount') 

    def pinCount(self, instance): 
     return Pin.objects.filter(user=instance).count() 

admin.site.unregister(User) 
admin.site.register(User, MyUserAdmin) 

는 핀 수에 의해 목록을 정렬 할 수 있어야한다 : 여기

내가 할 것입니다. 직접 데이터베이스 필드가 아니기 때문에 문서에 따르면 불가능합니다. 그것을 할 방법이 있습니까?

감사합니다.

답변

0

순서화가 아니라 관리자에 의해, DB를하면됩니다 (이 변경 목록 디버그 도구 모음의 출력 됨) : 사용자 지정 관리 방법을 사용하여 주문 할 수없는 이유

enter image description here

. 당신은 ModeAdmin.queryset method 덮어 쓰기하여 관리자의 검색어 세트에 Count 주석을 추가 할 수 있습니다

class MyModelAdmin(admin.ModelAdmin): 

    ... 

    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs \ 
      .annotate(pin_count=Count('pin')) \ 
      .order_by('-pin_count') 

또는 더 많은 제어를 필요로하는 경우, 당신은 sort the queryset displayed by the admin을 시도 할 수를하지만이 테스트하지 않았습니다 :

class MyModel(models.Model): 
    ... 

    @property 
    def pin_count(self): 
     return self.pin.count() 


import operator 
class MyModelAdmin(admin.ModelAdmin): 

    ... 

    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return sorted(qs, key=operator.attrgetter('pin_count')) 
0

나는 천국을 이 방법을 직접 사용하지는 않지만 해결 방법이있는 것 같습니다 (문제의 모델에 대한 사용자 지정 ModelManager를 정의하고 관리자 인터페이스 마법을 사용하는 ModelManager를 정의하는 것). Django admin: how to sort by one of the custom list_display fields that has no database field

귀하의 경우 문제는 해당 모델이 사용자 모델이므로 변경하는 것이 바람직하지 않을 수 있습니다. 귀하의 경우 여기에 설명 된대로 사용자 정의 UserProfile 모델을 추가하는 것이 좋습니다. Django user profile

이 값으로 자주 질의해야하는 경우 사용자의 각 사용자에 대해 pinCount 값을 구체화 할 것을 제안합니다. 프로필 모델. 요구 사항에 따라 데이터베이스 트리거를 사용하여이 값을 업데이트 된 상태로 유지할 수 있습니다.