2012-09-28 3 views
2

모델의 함수로 쿼리 세트를 필터링하고 싶습니다.django.admin.SimpleListFilter.queryset - 목록을 반환 하시겠습니까?

class CommentAdmin(admin.ModelAdmin): 

    class PostedByGuestFilter(admin.SimpleListFilter): 

     title = 'Posted by Guest' 
     parameter_name = 'posted_by_guest' 

     def lookups(self, request, model_admin): 
      return (
       (True, 'Yes'), 
       (False, 'No'), 
      ) 

     def queryset(self, request, queryset): 
      if self.value(): 
       return [comment for comment in queryset if comment.posted_by_guest()] 
      elif not self.value(): 
       return [comment for comment in queryset if not comment.posted_by_guest()] 

Unfortuneately, 내 데이터베이스가 손상되었음을 말해 django.admin이 된 구현 결과. 이 문제를 어떻게 해결할 수 있습니까?

enter image description here

답변

1

여기서 문제는 장고가의 검색어를 기대하고 코드 목록을 제공하고 있다는 점이다. 당신은 세트에 이해를 래핑하여이 문제를 해결할 수 있습니다 (별도의 SQL 쿼리가 발생합니다)

def queryset(self, request, queryset): 
     if self.value(): 
      return set(comment for comment in queryset if comment.posted_by_guest()) 
     elif not self.value(): 
      return set(comment for comment in queryset if not comment.posted_by_guest()) 
+1

이 솔루션을 사용하면 실제로이 오류가 발생합니다. – Colleen

1

이 최적이 아니다, 나는 (가능하면 SQL로 comment.posted_by_guest() 논리를 이동하는 방법을 모색 할 것 당신이)이 도움을 원한다면 그 방법의 몸을 보여 주지만,이 작동한다고 :

def queryset(self, request, queryset): 
    expected_value = self.value() 
    excludes = [] 
    for comment in queryset: 
     if comment.posted_by_guest() != expected_value: 
      excludes.append(comment.id) 
    return queryset.exclude(pk__in=excludes) 

장고 관리자 필터 API가 일부 개선과 함께 할 수있는!

관련 문제