【问题标题】:Django multiple queryset combine into a paginationDjango 多个查询集组合成一个分页
【发布时间】:2013-03-13 20:29:03
【问题描述】:

我已将来自不同模型的 2 个查询集组合成一个列表,并使用分页显示为一个列表。

问题是列表中的对象是根据创建它们的模型按分页显示的。

当从模型创建新对象时,我该如何修复列表。即使最近创建的对象来自不同的模型,它也会显示在最近创建的对象之后。

例如 .我有一个用户白板和用户评论的组合查询集。如果最近创建了一个新的白板对象,我将创建另一个评论。注释将在 whiteboard 的对象之后由分页显示,而不是与所有其他 cmets 一起显示在分页下方,因为它位于不同的模型中

我希望你能明白我想要达到的目标:)

我的模块的一部分

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})

存档.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>

【问题讨论】:

  • @catherine 我只是在玩弄这个组合 :)
  • @catherine 我正在尝试将字体添加到您所说的购物车中,但出现此错误无法将字符串转换为浮点数:
  • 我不知道这是否有帮助,它对数据进行了排序。 stackoverflow.com/questions/431628/…
  • @catherine 我昨天在那个网站上。我学会了如何将 2 个查询集组合在一起
  • @catherine 您使用 jquery javascript?css 在 3 个月内创建了该网站

标签: django django-queryset


【解决方案1】:

您只需通过created 共享的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

【讨论】:

  • 我昨天正在浏览该主题以结合 2 个查询集,然后我遇到了这个问题,我回头看它也回答了这个问题。 Timmy,它是从最旧的对象到最新的对象排序的。如何从最新到最旧的反向排序?
  • 添加关键字reverse=True。你可以看到更新的答案。 (关于博客;谢谢!)
  • 对于它的价值,如果你想做这种懒惰的风格而不是一次将它们全部提取到内存中 - 我围绕查询集创建了一个非常简单的包装器。pypi.python.org/pypi/django-compoundqueryset
  • @bwawok 但是这个组合查询集仍然没有order_by?也就是说,它只排序qs1,然后排序qs2,而不是相对于组合的qs1+qs2?
猜你喜欢
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2020-12-24
  • 2019-02-11
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 2016-10-30
相关资源
最近更新 更多