通常,我删除了多个会话到' for loop '。
我想将更改为'使用过滤器删除查询'以加快,如下面的示例代码。
但是,我不知道如何解决这个问题。
[案例1 ] - 效果很好
from django.contrib.sessions.models import Session
from datetime import datetime
def clear_expired_sessions():
for s in Session.objects.all():
if s.expire_date < datetime.now():
s.delete()
[更新查询的案例1 ] - 无法正常工作
from django.contrib.sessions.models import Session
from datetime import datetime
def clear_expired_sessions():
Session.objects.filter(expire_date<datetime.now()).delete()
产生NameError: name 'expire_date' is not defined
[案例2 ] - 效果很好
from django.contrib.sessions.models import Session
from accounts.models import UserProfile
def delete_specific_session():
user = UserProfile.objects.get(username="Tim")
for s in Session.objects.all():
if s.get_decoded().get('_auth_user_id') == user.id:
s.delete()
[案例2及更新查询] - 无法正常工作
from django.contrib.sessions.models import Session
from accounts.models import UserProfile
def delete_specific_session():
user = UserProfile.objects.get(username="Tim")
Session.objects.filter(????=user.id).delete()
在这种情况下,什么应该替代???=user.id
?
答案 0 :(得分:2)
尝试1失败的原因是基本的Django查询语法:您必须使用__lt
进行比较:
Session.objects.filter(expire_date__lt=datetime.now()).delete()
尝试2永远不会起作用,因为会话模型与用户模型没有任何关系。