Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django ORM-获取N个随机记录,然后将它们分成两组_Python_Django_Django Orm - Fatal编程技术网

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

Python Django ORM-获取N个随机记录,然后将它们分成两组,python,django,django-orm,Python,Django,Django Orm,我有一个后模型: class Post(models.Model): headline = models.CharField(max_length=255) ... 我试图获得的是两个随机分组,每组5篇文章,第二组记录第一组没有的内容,但没有成功 现在我知道了如何使用Python实现这一点,但我想知道是否有更优雅、更像ORM的解决方案 我尝试了以下方法: posts = Post.objects.all().order_by('?') first_group = posts[:

我有一个后模型:

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)
但这有时会在两组中返回相同的帖子

我还尝试通过以下方式欺骗系统:

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中循环记录了吗?

要获得独特的帖子,可以执行以下操作:

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

这样做的另一个优点是只进行一次数据库查询。

引用Django官方文档(),QuerySet是惰性的

这意味着QuerySet将不会向DB传递任何查询,直到您迭代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
posts=Post.objects.all()
第一组=[]
第二组=[]
迭代计数=0
在职人员:
如果迭代计数小于5:
第一组追加(post)
elif迭代计数<10:
第二组追加(post)
其他:
打破

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

太棒了!!它就像一个符咒。非常感谢你。将查询集转换为列表是非常聪明的:)