Django - Как отфильтровать по аннотированному значению - PullRequest
1 голос
/ 18 июня 2019

Рассмотрим следующую модель. Я хотел бы отфильтровать объекты по последней метке времени, которая может быть либо created_at, либо updated_at. По какой-то причине функция filter не распознает аннотированное поле, и мне трудно найти соответствующие примеры кода для выполнения этой простой вещи.

Сообщение об ошибке: «Не удается преобразовать ключевое слово timestamp в поле».

Как вы будете получать объекты примера в течение 7 дней, основываясь на более новой дате.

from datetime import timedelta
from django.db import models
from django.db.models.functions import Greatest
from django.utils import timezone


class Example(models.Model):

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(null=True)

    @property
    def recently_updated(self):
        return Event.objects
            .annotate(timestamp=Greatest('created_at', 'updated_at'))
            .filter(timestamp__gte=timezone.now() - timedelta(days=7))
            .order_by('-timestamp')

Джанго 1,11

1 Ответ

0 голосов
/ 18 июня 2019

Просто установите updated_at = models.DateTimeField(auto_now=True, null=True), таким образом, когда запись вставляется впервые, updated_at и creation_at будут одинаковыми, поэтому вы можете просто выполнить запрос на updated_at:

Event.objects.filter(updated_at__gte=timezone.now() - timedelta(days=7)).order_by('-timestamp')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...