Как в DJANGO запросить записи, не существующие после определенной даты?

Предположим, что у меня есть модель следующего вида:

class Invoices(models.Model):
    customer = models.ForeignKey(Customer, ...)
    date = models.DateField()
    amount = models.FloatField()

Я хочу знать всех клиентов, которые не совершали покупки в течение последних 30 дней.

По сути, это обратный запрос:

no_sales = Invoices.objects.filter(
    date__gte=certain_date_30_days_ago
).values(
    'customer__code'
)

использование .exclude() просто исключает клиентов, которые покупали в течение последних 30 дней, но не включает людей, которые не покупали в течение последних 30 дней.

Есть мысли? :) Спасибо!

Использование .exclude(…) [Django-doc] на модели Invoice не будет работать: оно не будет включать никаких Customer, которые никогда ничего не покупали. Но они все равно будут включать людей, которые купили что-то ранее: действительно, если Customer купил что-то 100 дней назад, а затем 20 дней назад, этот Customer все равно будет включен, так как Invoice для второй транзакции будет включен, но та, что была 100 дней назад, все равно будет сохранена.

Вы можете работать над моделью Customer с .exclude(…) с:

from datetime import timedelta
from django.utils.timezone import now

Customer.objects.exclude(
    invoices__date__gte=now()-timedelta(days=30)
)

Это вернет QuerySet из Customer, которые не связаны с Invoices записью за последние 30 дней.

Вернуться на верх