Django多个查询集组合成一个分页

Django multiple queryset combine into a pagination

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

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

enter image description here

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

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

氧化镁

我希望你能了解我正在努力实现的目标:)

模块的组成部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

视图.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{% for post in posts.object_list %}

{{post.name }}

{{post.body}}
{% endfor %}

        <!-- Next/Prev page links  -->
        {% if posts.object_list and posts.paginator.num_pages > 1 %}
       
            <span class="step-links">
                {% if posts.has_previous %}
                        newer entries &lt;&lt;
                {% endif %}

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

            {% if posts.has_next %}
                     &gt;&gt; older entries
            {% endif %}
        </span>
   
    {% endif %}


您只需按照它们共享的created属性对组合查询集列表进行排序:

1
2
3
4
5
6
7
8
9
10
from itertools import chain
...
posts = list(
            sorted(
                chain(picture,comment),
                key=lambda objects: objects.created,
                reverse=True  # Optional
            ))
paginator = Paginator(posts, 5)
...

这是一个类似的问题