1

我正在开发一个使用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()

模型如下所示:

基础.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.
    """

帐户模型:

class User(auth.User):
    def is_authenticated(self):
        return self.has_usable_password()

希望我提供了足够的信息,以便您可以帮助我解决问题。谢谢!

4

1 回答 1

0

我认为有几种方法可以让你清理它。

您可以通过以下方式获取帖子的所有作者唯一 ID:

user_ids_with_posts_list = Posts.objects.scalar('author.id', flat=True).distinct('author.id')

标量应该给你一个作者 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()
于 2012-07-04T12:34:41.773 回答