2010-06-04 2 views
1

기본적으로 나는 장고 프로젝트가 상당히 많습니다. 사용자가 다양한 전화 관련 작업을 관리 할 수있는 개인 웹 포털입니다.Django는 모델 필드 자동 정렬 방법이 있습니까?

여러 포털 페이지는 사용자에게 Model 개체 목록을 제공하고 HTML 표에 모든 특성을 나열하여 사용자가 시각적으로이 항목 목록을 볼 수 있도록합니다.

내가 겪고있는 문제는 다음과 같습니다. 장고 틱 (Django-ish) 또는 피톤 틱 (pythonic) 방법으로 필드 이름별로 이러한 Model 개체를 정렬 할 수 없습니다. ?

def list_partylines(request): 
    """ 
    List all `Partyline`s that we own. 
    """ 

    # Figure out which sort term to use. 
    sort_field = request.REQUEST.get('sortby', 'did').strip() 
    if sort_field.startswith('-'): 
     search = sort_field[1:] 
     sort_toggle = '' 
    else: 
     search = sort_field 
     sort_toggle = '-' 

    # Check to see if the sort term is valid. 
    if not (search in Partyline._meta.get_all_field_names()): 
     sort_field = 'did' 

    if is_user_type(request.user, ['admin']): 
     partylines = Partyline.objects.all().order_by(sort_field) 
    else: 
     partylines = get_my_partylines(request.user, sort_field) 

    variables = RequestContext(request, { 
     'partylines': partylines, 
     'sort_toggle': sort_toggle 
    }) 
    return render_to_response('portal/partylines/list.html', variables) 

소트 코드는 기본적으로 사용자가있는 것/URL/sortby = model_field_name 매개 변수를 지정할 수 있습니다 : 내가 무슨 말의 예를 들어, 여기에 모든 Partyline 모델 객체를 나열하는 내보기 중 하나입니다 그런 다음 사용자가 페이지에 표시된 HTML 테이블 이름을 클릭 할 때마다 정렬 된 객체 목록을 반환합니다.

저는 모델 객체의 목록을 모두 표시하고 정렬이 필요한 다양한 앱에서 다양한 뷰를 보유하고 있으므로이 정렬을 수행하는 일반적인 방법이 있다면 그렇게하지 않아도 될지 궁금합니다.

이 질문에 약간 불명 한 점이 있으면 죄송합니다.이 질문에 올바른 방법을 찾으려고 애 쓰고 있습니다.

감사합니다.

답변

2

내가 이것을 수행하는 방법은 사용자 정의 QuerySet을 사용하는 것입니다. 모델에서 클래스 QuerySet을 정의하고 거기에 정렬을 추가 할 수 있습니다. 모델 객체의 모든 로직을 유지하려면 get_my_partylines의 내용도 QuerySet으로 옮기십시오.

## This class is used to replicate QuerySet methods into a manager. 
## This way: Partyline.objects.for_user(foo) works the same as 
## Partyline.objects.filter(date=today).for_user(foo) 
class CustomQuerySetManager(models.Manager): 
    def get_query_set(self): 
     return self.model.QuerySet(self.model) 
    def __getattr__(self, attr, *args): 
     try: 
      return getattr(self.__class__, attr, *args) 
     except AttributeError: 
      return getattr(self.get_query_set(), attr, *args) 


class Partyline(models.Model): 
    ## Define fields, blah blah. 
    objects = CustomQuerySetManager() 
    class QuerySet(QuerySet): 
     def sort_for_request(self, request): 
      sort_field = request.REQUEST.get('sortby', 'did').strip() 
      reverse_order = False 
      if sort_field.startswith('-'): 
       search = sort_field[1:] 
      else: 
       search = sort_field 
       reverse_order = True 

      # Check to see if the sort term is valid. 
      if not (search in Partyline._meta.get_all_field_names()): 
       sort_field = 'did' 

      partylines = self.all().order_by(sort_field) 
      if reverse_order: 
       partylines.reverse() 
      return partylines 
     def for_user(self, user): 
      if is_user_type(request.user, ['admin']): 
       return self.all() 
      else: 
       ## Code from get_my_partylines goes here. 
       return self.all() ## Temporary. 

views.py는 :

def list_partylines(request): 
    """ 
    List all `Partyline`s that we own. 
    """ 
    partylines = Partylines.objects.for_user(request.user).sort_for_request(request) 
+0

나는 for_user 접근 방식을 좋아한다. 그게 어떻게 든 국제 대회입니까, 아니면 그냥 상식입니까? – Agos

+0

내 프로젝트에 대한 컨벤션으로 함께 해킹 한 것뿐입니다. 그것은 논리적 인 의미로 보이고 코드를 읽을 수있게 해줍니다. –

0

일반적인 방법으로 django.contrib.admin.views.main.ChangeList에서 어떻게 처리했는지 보여주는 훌륭한 예가 있습니다. 정렬을하면 힌트와 아이디어를 찾아 볼 수 있습니다. 더 많은 컨텍스트를 얻으려면 특히 django.contrib.admin.options.ModelAdminchangelist 메서드를보고 싶을 수도 있습니다.