Django ORM - 获取 N 条随机记录,然后将它们分成 2 组
Django ORM - Get N random records, and then split them in 2 groups
我有一个 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:]
但这有时会 return 两个组中的相同帖子。
我还试图欺骗系统执行以下操作:
posts = Post.objects.all().order_by('?')
first_group = posts[:5]
second_group = Post.objects.exclude(id__in=first_group)
但还是没有运气。
有人可以给我一些指示,这样我就不必在纯 Python 中遍历记录了吗?
要获得独特的帖子,您可以这样做:
posts = list(Post.objects.all().order_by('?')[:10])
first_group = posts[:5]
second_group = posts[5:]
这具有进行单个数据库查询的额外优势。
参考Django官方文档(https://docs.djangoproject.com/en/2.0/topics/db/queries/#querysets-are-lazy),QuerySet是惰性的
这意味着在您迭代 QuerySet 之前,QuerySet 不会将任何查询传递给数据库。
所以如果你想得到查询结果列表,你必须先迭代查询集。
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
也许,上面的代码可以正常工作。
我有一个 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:]
但这有时会 return 两个组中的相同帖子。
我还试图欺骗系统执行以下操作:
posts = Post.objects.all().order_by('?')
first_group = posts[:5]
second_group = Post.objects.exclude(id__in=first_group)
但还是没有运气。
有人可以给我一些指示,这样我就不必在纯 Python 中遍历记录了吗?
要获得独特的帖子,您可以这样做:
posts = list(Post.objects.all().order_by('?')[:10])
first_group = posts[:5]
second_group = posts[5:]
这具有进行单个数据库查询的额外优势。
参考Django官方文档(https://docs.djangoproject.com/en/2.0/topics/db/queries/#querysets-are-lazy),QuerySet是惰性的
这意味着在您迭代 QuerySet 之前,QuerySet 不会将任何查询传递给数据库。
所以如果你想得到查询结果列表,你必须先迭代查询集。
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
也许,上面的代码可以正常工作。