我正在开发一个以 Django和MongoDB 作为我的数据库的Web项目(使用MongoEngine连接它们)。 我必须创建Celery任务来清理旧用户帐户。我需要在一个月之后只清除懒惰用户帐户而没有任何内容(懒惰用户在首次连接到网站时自动创建用户)。什么算作内容?来自用户的任何帖子或任何帖子的评论。
我是这样做的,但如果可能,我想将其转换为查询:
def clean_inactive_lazy_users():
users_with_content = []
for post in api_models.Post.objects:
users_with_content.append(post.author)
for comment in post.comments:
users_with_content.append(comment.author)
users_with_content = list(set(users_with_content))
for user in account_models.User.objects:
if not user.is_authenticated() and (timezone.now() - user.connection_last_unsubscribe).days >= settings.DELETE_LAZY_USER_AFTER_DAYS and user not in users_with_content:
user.delete()
模型看起来像这样:
base.py
class AuthoredEmbeddedDocument(mongoengine.EmbeddedDocument):
author = mongoengine.ReferenceField(models.User, required=True)
class AuthoredDocument(mongoengine.Document):
author = mongoengine.ReferenceField(models.User, required=True)
api_models:
from . import base
class Comment(base.AuthoredEmbeddedDocument):
"""
This class defines document type for comments on posts.
"""
class Post(base.AuthoredDocument):
"""
This class defines document type for posts.
"""
account_models:
class User(auth.User):
def is_authenticated(self):
return self.has_usable_password()
希望我提供了足够的信息,以便您可以帮助我解决问题。谢谢!
答案 0 :(得分:0)
我认为有几种方法可以清理它。
您可以使用以下内容获取所有作者唯一的帖子ID:
user_ids_with_posts_list = Posts.objects.scalar('author.id', flat=True).distinct('author.id')
scalar应该为您提供作者ID列表,而不是文档对象和distinct 应该确保它们是独一无二的。这会将您在python中所做的事情推到mongodb
然后,您可以为用户构建查询。您可以将您的日子改为日期。 has_usable_password
检查的条件是什么?
start_time = timezone.now() - timedelta(days=DAYS_AGO_CONSTANT)
invalid_users = User.objects.filter(connection_last_unsubscribe__lte=start_time,
password__isnull=True).exclude(pk__in=user_ids_with_posts_list)
invalid_users.delete()