Фильтр объектов на основе даты истечения срока действия токена и даты_присоединения пользователя с помощью Q и "gt" Django

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

from django.db.models.functions import Now


def delete_unactivated_users():
    User = get_user_model()
    expiry = User.date_joined + timedelta(seconds=1800)
    unactivated_users = User.objects.filter(Q(Now()__gt=expiry) & (Q(is_active = False)))

    for user in unactivated_users:
        user.delete()
        print('<<<User Deleted>>>')
        user.save

Я получаю синтаксическую ошибку в строке 5 кода, я пытался использовать

unactivated_users = User.objects.filter(Q(expiry__lt=Now()) & (Q(is_active=False)))

, но это не привело к тому же значению. Похоже, что проблема заключается в размещении Now() и expiry в строке 5

Не видя вашей полной ошибки, я не могу быть уверенным, но определенно есть несколько вещей, которые не так:

Вам не нужно сохранять пользователя после его удаления (на самом деле вы не сможете этого сделать, так как он не будет существовать) - вы также можете удалить весь список сразу.

Вам не нужно Q

Импортируемый вами Now некорректен

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

from django.utils.timezone import now

def delete_unactivated_users(expiry_time):
    User = get_user_model()
    expiry = User.date_joined + timedelta(seconds=1800)
    unactivated_users = User.objects.filter(expiry__lt=now(), is_active = False)

    unactivated_users.delete()

Как я понял, вы хотите удалить неактивных пользователей, а точнее тех, у которых есть is_active=False и date_joined + 30 minutes is less than Now(). Если это так, то вот как вы можете это сделать.

from django.utils import timezone

def delete_inactive_users():
    User = get_user_model()

    inactive_users = User.objects.filter(
        date_joined__lt=timezone.now() - timezone.timedelta(seconds=1800), 
        is_active=False,
    )

    # you can delete all the records by once
    inactive_users.delete()
Вернуться на верх