Как мне написать запрос Django ORM, который ищет значение, которое близко, но не превышает определенного другого значения? - PullRequest
0 голосов
/ 14 января 2019

Я использую Python 3.7 с Postgres 9.5. Я хотел бы написать запрос Django ORM, если это возможно. У меня есть модель ниже

class PageStat(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, )
    elapsed_time = models.IntegerField(default=0)
    score = models.IntegerField(default=0)

То, что я хотел бы сделать, это написать запрос, который для данной статьи и истекшего времени (целое число в секундах) я бы хотел написать запрос, который возвращает объект PageStat с наибольшим значением истекшего времени, которое не Т превышает аргумент. Так, например, если моя таблица имела эти значения

article_id      elapsed_time
==================
1           10
1           20
1           30
2           15

И я выполнил поиск с идентификатором статьи "1" и прошедшим временем "15", я хотел бы получить первую строку (где article_id = 1 и elapsed_time = 10), поскольку "10" - это наибольшее значение, которое все еще меньше 15. Я знаю, как написать запрос для поиска статистики со статьей,

PageStat.objects.filter(article=article)

но я не знаю, как учесть значение времени.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вы можете заказать QuerySet по elapsed_time, а затем выбрать первый, например:

slowest_pagestat = PageStat.objects.filter(
    article=my_article,
    elapsed_time__lte=threshold
).order_by('-elapsed_time').first()

Это вернет объект PageState, если такой PageState существует, и None в противном случае.

Это сделает запрос, похожий на:

SELECT pagestat.*
FROM pagestat
WHERE pagestat.article_id = 1
AND   pagestat.elapsed_time <= 15
ORDER BY pagestat.elapsed_time DESC
LIMIT 1

с 1 первичным ключом my_article и 15 threshold.

0 голосов
/ 14 января 2019

Вы можете попробовать:

PageStat.objects.filter(elapsed_time__lte=20)

Есть также:

lt - less than 
gte - greater than equal
gt - greater than
etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...