Django получить случайные объекты из базы данных - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть база данных с миллионом + столбцов, и я хочу вернуть 100 случайных объектов из этой базы данных.

После поиска решения в Интернете я обнаружил, что существует большой аргумент в отношении order_by['?'] подход и его альтернативы (даже в Django официальной документации!). Кроме того, большинство дискуссий по этому вопросу относятся к 2010 г. + -.

Итак, мне интересно, как лучше всего генерировать случайные объекты из моей модели Djando. В документации Django я видел, что она может основываться на самой базе данных, поэтому имеет ли значение MySQL или PostgreSQL или что-то еще? или если это зависит от самого бэкэнда (AWS RDS или их конкурентов)

Вот моя модель:

class BasicPost(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    published = models.BooleanField(default=False)
    created_date = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=False)
    body = models.TextField(max_length=999)
    media = models.ImageField(blank=True)

    def get_absolute_url(self):
        return reverse('basic_post', args=[str(self.pk)])

    def __str__(self):
        return self.title

Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2020

Вы можете следовать прямым путем order_by['?'], как

BasicPost.objects.order_by("?")[:100]

Примечание: - Но order_by('?') запросы могут быть дорогими и медленными, в зависимости от баз данных.


Лучший путь: django -random-queryset

Шаг-1: Добавить RandomManager к нужной модели:

from django.db import models

from django_random_queryset import RandomManager

class BasicPost(models.Model):
    objects = RandomManager()
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    # ...

Шаг-2: Использовать

queryset = BasicPost.objects.all()
queryset.random()   # get one random record
queryset.random(100)  # get 100 random records
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...