2013-03-24 21 views
2

我已經將來自不同模型的2個查詢集合到列表中,並使用分頁顯示爲單個列表。Django多個查詢集合到一個分頁

問題是從列表中的對象根據它們創建的模型按分頁顯示。

enter image description here

我怎麼能修復列表,以便當從模型中創建一個新的對象。即使最近創建的對象來自不同的模型,它也會顯示在最近創建的對象之後。

舉例如下。我有用戶的白板和用戶評論的組合查詢集。如果最近創建了新的白​​板對象,我會創建另一條評論。註釋將由分頁白板的對象,而不是被顯示與所有的其他意見進一步下跌的分頁,因爲它是在一個不同的模式

enter image description here

我希望你能明白我的意思後顯示什麼我想要實現我:)模塊的

零件

class WhiteBoard(models.Model): 

    user = models.ForeignKey(User) 
    name = models.CharField(max_length=100) 
    created = models.DateTimeField(auto_now_add=True) 
    picture = models.OneToOneField('Picture',related_name='picture',blank=True,null=True) 
    def __unicode__(self): 
     return self.name 


class Comment(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    user = models.ForeignKey(User) 
    body = models.TextField() 
    picture = models.ForeignKey(Picture) 

views.py

@login_required 
def archive(request): 
     user = User.objects.get(username=request.user) 
     person = Person.objects.get(user=user) 
     users = User.objects.filter(pk__in=person.following.all().values_list('user__pk',flat=True)) 
     picture = whiteboard .objects.filter(user__in=users).order_by("-created") 
     comment = Comment.objects.filter(user__in=users).order_by("-created") 
     posts= list(chain(picture,comment)) 
     paginator = Paginator(posts, 5) 

     try: page = int(request.GET.get("page", '1')) 
     except ValueError: page = 1 

     try: 
      posts = paginator.page(page) 
     except (InvalidPage, EmptyPage): 
      posts = paginator.page(paginator.num_pages) 
     return render(request,'archive.html',{'picture':picture,'comment':comment,'posts':posts}) 

archive.html

{% for post in posts.object_list %} 

{{post.name }} 
<br> 
{{post.body}} 
{% endfor %} 

     <!-- Next/Prev page links --> 
     {% if posts.object_list and posts.paginator.num_pages > 1 %} 
     <div class="pagination" style="margin-top: 20px; margin-left: -20px; "> 
      <span class="step-links"> 
       {% if posts.has_previous %} 
         <a href= "?page={{ posts.previous_page_number }}">newer entries &lt;&lt; </a> 
       {% endif %} 

        <span class="current"> 
        &nbsp;Page {{ posts.number }} of {{ posts.paginator.num_pages }} 
       </span> 

      {% if posts.has_next %} 
        <a href="?page={{ posts.next_page_number }}"> &gt;&gt; older entries</a> 
      {% endif %} 
     </span> 
    </div> 
    {% endif %} 

</div> 
+0

@catherine我只是與周圍碴組合:) – donkeyboy72 2013-03-24 09:28:45

+0

@catherine我想添加一個字體到你說的它的車,我得到這個錯誤無法控制垂直字符串浮動: – donkeyboy72 2013-03-24 09:36:22

+0

我不知道這是否會有所幫助,它對數據進行排序。 http://stackoverflow.com/questions/431628/how-to-combine-2-or-more-querysets-in-a-django-view – catherine 2013-03-24 09:42:32

回答

5

你只需要通過created屬性sort合併後的查詢集的名單他們都分享到:

from itertools import chain 
... 
posts = list(
      sorted(
       chain(picture,comment), 
       key=lambda objects: objects.created, 
       reverse=True # Optional 
      )) 
paginator = Paginator(posts, 5) 
... 

Here's a similar question on the topic

+0

昨天我正在瀏覽那個話題,合併2個查詢集,然後我碰到這個問題,我回頭看,它也回答了這個問題。蒂米,它是從最古老的物體到最新的物體。我如何從逆向排序,如最新到最舊? – donkeyboy72 2013-03-24 11:32:43

+0

添加關鍵字'reverse = True'。你可以看到更新的答案。 (關注博客;謝謝!) – 2013-03-24 11:36:33

+1

對於它的價值,如果你想做這個懶惰的風格,而不必一次將它們全部獲取到內存中 - 我創建了一個非常簡單的包裝查詢集.. https:// pypi。 python.org/pypi/django-compoundqueryset – bwawok 2016-07-10 20:45:52