2013-03-24 3 views
2

Я объединил 2 набора запросов из разных моделей в список и использовал разбивку на страницы для отображения в виде единого списка.Django multiple queryset объединяется в разбивку на страницы

Проблема заключается в том, что объекты из списка отображаются в разбивке по страницам в соответствии с моделями, из которых они были созданы.

enter image description here

Как я мог исправить список таким образом, когда новый объект создается из моделей. Он будет отображаться после недавно созданного объекта, даже если последний созданный объект был из разных моделей.

Пример будет. У меня есть запрос на сборку пользовательской доски пользователя и комментарий пользователя. Если недавно был создан объект новой доски, и я бы создал еще один комментарий. Комментарий будет отображаться в пагинацией после объекта, досок «s вместо выставлялись со всеми другими комментариями далее вниз постраничным, потому что он был в разных моделях

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 Я просто отводом вокруг с the combination :) – donkeyboy72

+0

@catherine Я пытаюсь добавить шрифт в корзину вашего сказанного, и я получил эту ошибку, не мог vert string to float: – donkeyboy72

+0

Я не знаю, поможет ли это, он отсортировал данные. http://stackoverflow.com/questions/431628/how-to-combine-2-or-more-querysets-in-a-django-view – catherine

ответ

5

Вам просто нужно sort список объединенных querysets атрибутом created они оба разделяют:

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

+0

Добавьте ключевое слово 'reverse = True'. Вы можете увидеть обновленный ответ. (С уважением к блогу, спасибо!) –

+1

Для чего это стоит, если вы хотите сделать этот ленивый стиль и не должны сразу их вставлять в память - я создал очень простую оболочку вокруг запроса. Https: // pypi. python.org/pypi/django-compoundqueryset – bwawok

Смежные вопросы