2013-07-23 5 views
1

'date_created'라는 'DateTimeField'가있는 다른 모델이 있습니다. 모든 모델에서 모든 객체를 선택하고 'date_created'필드를 기준으로 정렬 한 다음 목록으로 반환해야합니다.오브젝트의 date_created 속성으로 다른 모델의 쿼리 세트 오브젝트 목록 정렬

models.py

class FirstModel(models.Model): 
    title = models.CharField(max_length=100) 
    date_created = models.DateTimeField() 


class SecondModel(models.Model): 
    title = models.CharField(max_length=100) 
    date_created = models.DateTimeField() 

views.py

def browse(request): 
    object_list = [] 
    for model in get_models(get_app('myapp')): 
     object_list.append(model.objects.order_by('-date_created').all()) 
    object_list = sorted(object_list, key=attrgetter('date_created')) 
    context = {'data': object_list} 
    return render(request, 'myapp/browse.html', context) 

나는 오류 '검색어 세트'개체가 어떤 속성 'DATE_CREATED을'이없는 얻을 :

나는 다음을 시도했다.

이 모델에는이 질문과 관련없는 다른 필드가 있습니다. 나는 모든 객체들을 함께 모으기 위해 공통의 기본 클래스를 사용할 수 있지만, 어떤 이유로 든 추상적 인 기본 클래스를 사용하고있다. 나는 '조인'이 사용될 수 있다고 생각하지만 어떻게 해야할지 잘 모릅니다.

그래서이 object_list (다른 모델의 개체 목록)는 date_created 특성으로 정렬 할 수 있습니까?

답변

3

나는 더 많은 연구를 통해 답을 찾았습니다.

문제는이 라인에 있습니다

object_list.append(model.objects.order_by('-date_created').all()) 

내가 "추가"사용하고 있지만, 그것은 일반 목록보다는의 검색어 객체의리스트 {나는 이것에 대해 좀 확실 해요로 처리됩니다, 기본적으로이 줄은 모든 queryset 객체 목록 만 필요로하는 목록을 나에게 제공합니다. 아래와 같이 행 itertools} 본 chain() 체인을 가져 라인 위에 대체하여 사용될 수있는 해결하려면 다음

from itertools import chain 
... 
... 
object_list = chain(object_list, (model.objects.order_by('-date_created').all())) 
... 

나머지 모든 것이 잘이다. 또한 질문에서 지적한대로 multi table inheritence을 사용하면 단일 쿼리로 모든 결과를 얻을 수 있습니다. order_by

1

난 당신이 코드이 코드

object_list.append(model.objects.order_by('-date_created').all()) 

을 교체해야한다고 생각 :

object_list.append(model.objects.all().order_by('-date_created')) 

그리고 난 당신이 코드

object_list = sorted(object_list, key=attrgetter('date_created')) 

를 사용할 필요가 없습니다 생각 당신 때문에 이미 "주문"을 사용하여 정렬되었습니다.

+0

사실, 다른 모델의 정렬 목록을 얻을 수는 있지만 최종 정렬해야합니다. 목록 즉 모든 개별 정렬 된 모델 개체 목록의 조합. –

관련 문제