2011-10-02 3 views
4

내 사이트에는 두 개의 앱으로 구성되어있는 세 개의 모델이 있습니다.이 모델에는 모두 timestamp 필드가 있습니다.이 필드는 사이트 피드의 모양 순서를 정의합니다. 모든 모델에 대한 피드를 만들고 timestamp 필드로 단일 쿼리를 정렬하는 대신이 모든 객체를 포함하는 단일 피드를 생성하고 각 템플릿을 해당 템플릿으로 렌더링하며 모두 timestamp 속성으로 정렬 된 피드를 생성하려고합니다.다른 모델에서 단일 피드를 생성하는 가장 좋은 방법은 무엇입니까?

내 첫 번째 시도는 모든 개체를 나열하고 하나의 목록에 결합 파이썬에서 그들을 분류된다 :

class SiteFeed(Feed): 
    ... 
    def items(self): 
     objects = list(model1.objects.all()) + list(model2.objects.all()) + list(model3.objects.all()) 
     objects.sort(key=lamda obj: obj.timestamp) 
     return = objects 

답변

2

은 내가 items 방법에서 반복자를 반환합니다. 이 경우 객체의 정렬 및 집계는 게으른 방식으로 수행 될 수 있습니다. 반복자를 구성하기 전에 결합하려는 오브젝트의 세 가지 콜렉션을 사전 정렬하면 최종 정렬은 각 반복에서 올바른 콜렉션의 다음 오브젝트를 선택하는 것입니다. 무슨 뜻인지 알 겠어?

 
class SiteFeed(Feed): 
    ... 
    def items(self): 
     i = model1.objects.order_by('timestamp').iterator() 
     j = model2.objects.order_by('timestamp').iterator() 
     k = model3.objects.order_by('timestamp').iterator()
try: u = i.next() except StopIteration: u = None
try: v = j.next() except StopIteration: v = None
try: w = k.next() except StopIteration: w = None ... yield min([u,v,w], key=lambda x: x.timestamp if x else datetime.max) ... # at this point you need to reiterate the iterator # corresponding to the variable that you yielded # and yield again # so, the above code must be in some sort of a loop # until ALL iterators are exhausted

+0

난 당신이 대답을 ilustrate하기위한 예제 코드를 제공하시기 바랍니다 수 반복자에 익숙하지 않아요 : 예를 들어

? 반복기를 만드는 법을 알 수는 없지만 일반적인 생각을 이해한다고 생각합니다. –

+0

대답을 업데이트했습니다 – akonsu

+0

간단한 반복기입니다. 문제는 여전히 남아 있습니다. 공통된 속성 인'타임 스탬프 (timestamp) '로 정렬 된 다른 모델의 모든 객체가 필요합니다. 이 코드에서는 'model1' 객체 만 반환됩니다. –

관련 문제