Я использую Django с Python 3.7 и PostGres 9.5. Я использую следующее, чтобы получить все свои объекты и перебрать их ...

article_set = Article.objects.all()
for article in article_set:

Есть ли способ изменить мой существующий запрос или, возможно, цикл так, чтобы объекты каждый раз возвращались в случайном порядке? Я бы предпочел не делать второй запрос, если это вообще возможно.

-2
Dave 1 Июл 2019 в 04:31

3 ответа

Лучший ответ

Как объясняется в документацию, которую вы можете использовать order_by('?') следующим образом:

article_set = Article.objects.order_by('?')
2
ivissani 1 Июл 2019 в 02:07

Я не слишком знаком с Джанго, и поправьте меня, если я ошибаюсь, но я бы предположил, что:

Article.objects.all()
#Roughly equates to:
"SELECT * from articles"

Поэтому я считаю, что вы должны быть в состоянии сделать:

Article.objects.all().order_by('RANDOM()')
#Thus producing this SQL statement:
"SELECT * from articles ORDER BY RANDOM()"

Который должен перепутать ваш вывод.


В противном случае, я бы сказал, пойти с random.shuffle подходом.

from random import shuffle

article_set = Article.objects.all()
for article in shuffle(article_set):
    #do work

Дайте мне знать, сработал ли order_by, и я могу соответственно изменить. Как я уже сказал, я не слишком знаком с Django, так что это не проверено, но в теории должно работать. Благодарность!

0
Jab 1 Июл 2019 в 01:54

Сделайте такую петлю

article_set = Article.objects.all()
for article in random.shuffle(article_set):
    print(article)
0
Arun Augustine 1 Июл 2019 в 01:53