Django ORM: получить самый последний предыдущий объект, который соответствует определенному условию - PullRequest
2 голосов
/ 21 января 2009

Учитывая объект как:

class M(models.Model):
  test = models.BooleanField()
  created_date = models.DateTimeField(auto_now_add=True)

Приведенные примеры данных (предположим, монотонно увеличивающееся автоматическое число созданной даты):

M(test=False).save()

M(test=True).save()

M(test=False).save()

X = M(test=True).save()

M(test=False).save()

Y = M(test=False).save()

M(test=False).save()

M(test=True).save()

Можно ли использовать Django ORM для создания запроса, который будет возвращать X (предыдущий запрос по дате, где 'test' = True), если вам задан Y? Если да, то как?

Другими словами: учитывая Y, как получить самый последний предыдущий элемент, где 'test' - True?

Мысли и отзывы приветствуются, спасибо!

Ответы [ 2 ]

6 голосов
/ 21 января 2009

Попробуйте это

M.objects.filter(created_date__lte=Y.created_date).filter(test=True)[0:1]

Вы также можете добавить предложение order_by, например

M.objects.filter(created_date__lte=Y.created_date)\
         .filter(test=True)\
         .order_by('-created_date')[0:1]

Это должно работать.

3 голосов
/ 21 января 2009

С помощью поиска в полях Django вы можете достичь чего-то, что вы хотите, с помощью следующего выражения:

M.objects.filter( test=True, created_date__lt=Y.created_date ).order_by( '-created_date' )

В зависимости от того, есть или нет какие-либо элементы в результирующем объекте набора запросов, вы можете выбрать самый первый, который будет самым последним требуемым объектом.

...