Как аннотировать значение медианы в django queryset - PullRequest
0 голосов
/ 12 января 2020

У меня есть 2 модели Puzzle and Play. для каждой игры у меня есть рейтинг. Я бы хотел добавить в набор запросов Puzzle значение медианы для всех соответствующих игр.

class Puzzle(models.Model):
    name = models.CharField(max_length=255)

class Play(models.Model):
    puzzle = models.ForeignKey(Puzzle, on_delete=models.CASCADE,related_name='plays')
    rating = models.IntegerField(default=-1)
    puzzle_completed = models.BooleanField(default=None, blank=False, null=False)

Я знаю, как считать:

Puzzle.objects.annotate(nb_sucesses=Count('plays', filter = Q(plays__puzzle_completed=True), distinct = True),)

, и я ожидал получить медиану в похожим образом:

Puzzle.objects.annotate(rating_median=Median('plays__rating', filter = Q(plays__puzzle_completed=True), distinct = True),)

однако, по-видимому, из-за моей Django базы данных среды разработки ( sqlite ) я не могу этого сделать.

От что я извлек из следующей информации https://mariadb.com/kb/en/median/, в моей производственной среде ( MariaDB ) этот подход должен работать (но я его еще не проверял)

Мое текущее понимание (основанное на различных поисках inte rnet) заключается в том, что я должен иметь возможность использовать функцию Django Fun c () для использования пользовательской медианной функции ( по этой модели? ) это может вызвать либо Median, если он находится в работе, либо более сложный необработанный запрос sql, если он находится в разработке (основано на этом? или на этом? ).

Но через несколько часов я должен признать, что я здесь вне своей глубины.

Ульд, пожалуйста, помогите мне соединить точки?

1 Ответ

0 голосов
/ 13 января 2020

В Django отсутствует реализация Median, поскольку она не реализована в PostgreSQL.

. Вы можете запустить median на MariaDB 10.3.3+ как необработанный запрос или написать самостоятельно. агрегатная функция внутри Django для ваших пользовательских нужд, которая затем будет преобразована в тот же запрос с использованием ORM

. Вы обязательно должны иметь одинаковый тип БД в рабочей среде и среде разработки, чтобы минимизировать ошибки из-за различных сред (предлагает также использовать такие инструменты, как docker)

...