【问题标题】:Get all Objects one by one but in a random way以随机方式一个一个地获取所有对象
【发布时间】:2019-01-28 08:09:09
【问题描述】:

这是另一篇文章的代码:

from random import randint
count = article.objects.all().count()
random_index = randint(0, count - 1)
all_articles_query =  article.objects.all()
article = all_articles_query[random_index]

但现在我想多次从列表 all_articles_query 中删除文章。我想对文章列表进行排序,然后对随机文章进行排序,每次我对随机文章进行排序以将其从文章列表中移出。

我想以一种随机的方式一篇一篇地获取所有文章。

问候

【问题讨论】:

  • article.objects.order_by('?')
  • 这会杀死数据库我的意思是它的成本很高@heemayl
  • 如果all_articles_query 的位置是随机的,并且每个都进入for循环,有什么不同吗?
  • This 应该可以解决您的问题

标签: python django django-queryset


【解决方案1】:

我认为你可以尝试使用random.randrange

import random

article_list = list(article.objects.all())  # evaluating queryset before everything

while article_list:
    sample = article_list.pop(random.randrange(len(article_list)))
    print(sample)

【讨论】:

    【解决方案2】:

    您可以使用自定义模型管理器来执行此操作。

    class ArticleManager(models.Manager):
        def random(self):
            count = self.aggregate(count=Count('id'))['count']
            random_index = randint(0, count - 1)
            return self.all()[random_index]
    

    然后在文章模型中

    class Article(models.Model):
        ...
        random_objects = ArticleManager()
    

    然后在查询中使用

    Article.random_objects.random()
    

    【讨论】:

    • 这将得到重复的项目,如果数量足够小
    • 如何返回重复的?你能详细说明一下吗?
    • 如果你运行Article.random_objects.random()这么多次,它可以在2次返回相同的对象random()
    • 没有。我测试它。它始终返回 1 个对象。请检查一下好吗?
    • 把它打印到for i in xrange(0,1000):,你就可以看到发生了什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多