我有這樣的模型User:
class User(AbstractBaseUser, PermissionsMixin):
myfield_choices = (('foo', 'First value'), ('bar', 'Second value')
myfield = CharField(choices=choices)
objects = BaseUserManager()
我在欄位myfieldvalue 中設定foo。我想在欄位myfield值中bar設定 1 天后,在此期間到期后,該值會foo自動再次變為。
如何設定到期時間?是否有任何本地 django 樂器?
uj5u.com熱心網友回復:
我假設您對 Django 有點陌生,所以我會建議一個不基于任務佇列的解決方案(如celery或dramatiq)。
為了清楚起見,讓我們假設我們正在實施ban_user和unban_user機制。首先,我們必須更新User模型:
class User(AbstractBaseUser, PermissionsMixin):
class BanStatus(models.TextChoices):
ACTIVE = "ACTIVE", "ACTIVE"
BANNED_FOR_DAY = "BANNED_FOR_DAY", "BANNED_FOR_DAY"
ban_status = models.TextField("Ban status", choices=BanStatus.choices)
banned_for_day_at = models.DateTimeField("Banned for day at", null=True)
然后我們必須實作精確的機制。我更喜歡在某個your-app-name/logic/ban_user.py檔案中執行此操作:
from django.utils import timezone
# And also an import of User.
def ban_user_for_day(user: User):
user.ban_status = User.BanStatus.BANNED_FOR_DAY
user.banned_for_day_at = timezone.now()
user.save()
def revoke_ban_user_for_day(user: User):
user.ban_status = User.BanStatus.ACTIVE
user.banned_for_day_at = None
user.save()
因此我們可以ban_user_for_day從視圖中呼叫。至于revoke_ban_user_for_day,組織呼叫它的最簡單方法是Command可以定期呼叫的 a cron,例如使用 。你可以把它放在your-app-name/management/commands/revoke_ban_user_for_day.py
from django.core.management import BaseCommand
from django.utils import timezone
# And also imports of User and revoke_ban_user_for_day.
class Command(BaseCommand):
def handle(self, *args, **options):
user_list_for_revoke = User.objects.filter(
ban_status=User.BanStatus.ACTIVE,
banned_for_day_at__lte=timezone.now() - timezone.timedelta(days=1)
).all()
for user in user_list_for_revoke:
revoke_ban_user_for_day(user)
就這樣。如果您將此設定Command為每分鐘運行一次,則User應該取消禁止的時間與實際取消禁止的時間之間的延遲不會超過 1 分鐘。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399333.html
