1

这是我的用户模型-

class CustomUser(AbstractUser):

  user_id = models.UUIDField(default=uuid.uuid4,editable=False,primary_key=True)
  username = models.CharField(max_length = 100,unique = True)
  friends = models.ManyToManyField('CustomUser',related_name="friend", blank= True)
  user_last_seen = models.DateTimeField(auto_now_add=False)

我可以使用以下中间件跟踪用户最后一次出现的时间(无论他们是否注销):

class ActiveUserMiddleware(MiddlewareMixin):

  def process_request(self, request):
      current_user = request.user
      if request.user.is_authenticated:
        now = datetime.datetime.now()
        current_user.user_last_seen = now
        current_user.save(update_fields=['user_last_seen'])

并且还能够在我的模板中显示它们是否在当前时刻处于活动状态,或者它们最后一次出现的时间 -

 {%if i.user_last_seen|timesince|upto:',' < "1 minutes" %}
 <td style="font-size:small; color:green;text-align:right;">
 Active Now
 </td>
 {%else%}
 <td style="font-size:small; color:gray;text-align:right;">
 {{i.user_last_seen|timesince|upto:','}} ago
 </td>
 {%endif%}

除此之外,我想显示当前活跃的用户总数,他们是某个用户的朋友。但我很难理解如何准确地做到这一点。当谈到 Django 时,我仍然是初学者,任何建议或想法都会非常有帮助。

4

1 回答 1

1

您可以使用以下方法计算不到一分钟前最后一次看到的数字:

from django.utils.timezone import now
from datetime import timedelta

active_users = CustomUser.objects.filter(
    user_last_seen__gte=now()-timedelta(minutes=1)
).count()

或活跃朋友的数量:

from django.utils.timezone import now
from datetime import timedelta

active_friends = request.user.friends.filter(
    user_last_seen__gte=now()-timedelta(minutes=1)
).count()

因此,您可以在视图或上下文处理器中使用它来将活动用户的数量传递给模板。

您还可以在 中定义逻辑CustomUser以检查用户是否处于活动状态:

from django.utils.timezone import now
from datetime import timedelta

class CustomUser(AbstractUser):
    user_id = models.UUIDField(default=uuid.uuid4,editable=False,primary_key=True)
    username = models.CharField(max_length = 100,unique = True)
    friends = models.ManyToManyField('CustomUser', blank= True)
    user_last_seen = models.DateTimeField(auto_now_add=False)

    @property
    def recently_active(self):
        return self.user_last_seen >= now()-timedelta(minutes=1)
于 2020-10-15T16:19:44.850 回答