Как вытянуть случайную запись с помощью ORM Django?

НОВЫЙ ОТВЕТ Используйте для этого библиотеку Glide. Эта библиотека также рекомендуется Google. См. Как округлить изображение с помощью библиотеки Glide?

СТАРЫЙ ОТВЕТ Просто добавьте это изображение в cardView и установите высоту cardView на 0dp ... хитрость (в моем случае это была viewPager с изображениями - просто замените viewPager на ImageView):



        

    

169
задан kender 7 June 2009 в 19:25
поделиться

4 ответа

плагин jQuery mureSelectors поддерживает n-й тип (и многие другие селекторы). Я предлагаю либо использовать это, либо просто реализовать простой плагин, который реализует только точные селекторы вам нужны. Вы должны иметь возможность копировать-вставить код оттуда.

Счастливый взлом!

-121--2348321-

Исходя из моего собственного опыта, это в пределах метров.

-121--3665321-

Использование order _ by ('?') убьет сервер базы данных на второй день производства. Лучшим способом является то, что описано в Получение случайной строки из реляционной базы данных .

from django.db.models.aggregates import Count
from random import randint

class PaintingManager(models.Manager):
    def random(self):
        count = self.aggregate(count=Count('id'))['count']
        random_index = randint(0, count - 1)
        return self.all()[random_index]
158
ответ дан 23 November 2019 в 20:49
поделиться

Вы можете создать менеджер в своей модели, чтобы делать такие вещи. Чтобы сначала понять, что такое менеджер, метод Painting.objects - это менеджер, который содержит all () , filter () , get () и т. Д. Создание собственного менеджера позволяет вам предварительно фильтровать результаты и использовать все те же методы, а также ваши собственные методы для работы с результатами.

EDIT : Я изменил свой код, чтобы отразить метод order_by ['?'] . Обратите внимание, что менеджер возвращает неограниченное количество случайных моделей. Из-за этого я включил небольшой код использования, чтобы показать, как получить только одну модель.

from django.db import models

class RandomManager(models.Manager):
    def get_query_set(self):
        return super(RandomManager, self).get_query_set().order_by('?')

class Painting(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # The default manager.
    randoms = RandomManager() # The random-specific manager.

Использование

random_painting = Painting.randoms.all()[0]

Наконец, вы можете иметь много менеджеров в своих моделях, поэтому не стесняйтесь создавать LeastViewsManager () или MostPopularManager () .

10
ответ дан 23 November 2019 в 20:49
поделиться

Решения с order_by ('?') [: N] чрезвычайно медленны даже для таблиц среднего размера, если вы используете MySQL (не знаю о других базах данных).

order_by ('?') [: N] будет преобразовано в SELECT ... FROM ... WHERE ... ORDER BY RAND () LIMIT N запрос.

Это означает, что для в каждой строке таблицы будет выполняться функция RAND (), затем вся таблица будет отсортирована в соответствии со значением этой функции, а затем будут возвращены первые N записей. Если ваши столы маленькие, это нормально. Но в большинстве случаев это очень медленный запрос.

Я написал простую функцию, которая работает, даже если в идентификаторах есть дыры (некоторые строки были удалены):

def get_random_item(model, max_id=None):
    if max_id is None:
        max_id = model.objects.aggregate(Max('id')).values()[0]
    min_id = math.ceil(max_id*random.random())
    return model.objects.filter(id__gte=min_id)[0]

Это быстрее, чем order_by ('?') Почти во всех случаях.

26
ответ дан 23 November 2019 в 20:49
поделиться

Просто используйте:

MyModel.objects.order_by('?').first()

Это описано в QuerySet API .

245
ответ дан 23 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: