Вот что я в итоге сделал вместо предложения Томаса. Обратите внимание, что я отказался использовать декоратор приемника, чтобы он все еще работал до версии 1.3.
(Это требует серьезного исправления).
from django.db import models
from people.models import Member
from django.contrib.sessions.models import Session
from django.contrib.sessions.backends.db import SessionStore
from django.db.models import *
from django.db.models.signals import post_save, pre_delete, post_init
#from django.dispatch import receiver
from datetime import datetime
class SessionInfo(models.Model):
#note: a OneToOneField with the name 'session' has been added as part of the inheritance
created = models.DateTimeField(auto_now_add=True) #joined field is auto initialized with creation time
session = models.OneToOneField(Session)
def age(self):
return (datetime.now() - self.created)
def session_create_listener(instance, **kwargs):
store = SessionStore(session_key=instance.session_key)
if '_auth_user_id' in store:
try:
sessioninfo = SessionInfo.objects.get(session=instance)
except SessionInfo.DoesNotExist:
sessioninfo = SessionInfo(session=instance)
sessioninfo.save()
store['anonymous'] = False
store.save()
else:
try:
store['anonymous']
except KeyError:
store['anonymous'] = True
store.save()
post_save.connect(session_create_listener, sender=Session)
Я надеюсь, что кто-то может исправить это для меня, потому что я не могу поверить, что это самый эффективный способ сделать это.
Прежде всего, это добавляет ДВА дополнительных обращения к базе данных (с первой попытки: sessioninfo = SessionInfo.objects.get (session = instance)) каждый раз, когда сеанс изменяется.
Первый явно во время поиска. Второе происходит, когда происходит сохранение, снова вызывая весь процесс.
Что делать вместо этого?