У меня есть две модели:
Модель A - это модель AbstractUserModel, а модель B
class ModelB:
user = ForeignKey(User, related_name='modelsb')
timestamp = DateTimeField(auto_now_add=True)
Я хочу узнать, сколько пользователей имеют хотя бы один объект ModelB, созданный хотя бы за 3 из 7 прошедших дней .
Пока что я нашел способ сделать это, но я точно знаю, что естьлучше, и именно поэтому я отправляю этот вопрос.
Я в основном разделил запрос на 2 части.
Part1:
Я добавил метод foo в модель пользователя, который проверяет, соответствует ли пользователь указанным выше условиям
def foo(self):
past_limit = starting_date - timedelta(days=7)
return self.modelsb.filter(timestamp__gte=past_limit).order_by('timestamp__day').distinct('timestamp__day').count() > 2
Часть 2 :
В Диспетчере нестандартных пользователей я нахожу пользователей, которые имеют более 2 объектов modelsb за последние 7 дней, и перебираю их, применяя метод foo для каждого из них.
Делая это, я сужаю итерации необходимого цикла for.(в основном это функция фильтра, но вы понимаете, в чем дело)
def boo(self):
past_limit = timezone.now() - timedelta(days=7)
candidates = super().get_queryset().annotate(rc=Count('modelsb', filter=Q(modelsb__timestamp__gte=past_limit))).filter(rc__gt=2)
return list(filter(lambda x: x.foo(), candidates))
Тем не менее, я хочу знать, есть ли более эффективный способ сделать это, без цикла for.