Django ORM - 获取N个随机记录,然后将它们分成两组

时间:2018-02-15 11:41:30

标签: python django django-orm

我有一个Post模型:

class Post(models.Model):
    headline = models.CharField(max_length=255)
    ...

我是不成功的,试图达到的目的是获得两个随机组,每组5个帖子,第二组记录第一组没有。

现在我知道如何使用Python做到这一点,但我想知道是否有更优雅,类似ORM的解决方案。

我尝试了以下内容:

posts = Post.objects.all().order_by('?')
first_group = posts[:5]
second_group = posts[5:]

但是,这有时会在两个组中返回相同的帖子。

我还尝试欺骗系统执行以下操作:

posts = Post.objects.all().order_by('?')
first_group = posts[:5]
second_group = Post.objects.exclude(id__in=first_group)

但又没有运气。

有人可以给我一些指示,所以我不必在纯Python中循环记录吗?

2 个答案:

答案 0 :(得分:3)

要获得独特的帖子,您可以:

posts = list(Post.objects.all().order_by('?')[:10])
first_group = posts[:5]
second_group = posts[5:]

这具有进行单个数据库查询的附加优势。

答案 1 :(得分:0)

引用Django正式文档(https://docs.djangoproject.com/en/2.0/topics/db/queries/#querysets-are-lazy),QuerySet很懒惰。

这意味着在迭代QuerySet之前,QuerySet不会将任何查询传递给DB。

因此,如果要将查询结果提供给列表,则必须首先迭代查询集。

posts = Post.objects.all().order_by('?')
first_group = []
second_group = []

iterate_count = 0
for post in posts:
    if iterate_count < 5:
        first_group.append(post)
    elif iterate_count < 10:
        second_group.append(post)
    else:
        break

也许,上面的代码可以正常工作。