MongoEngine查询获得Post的作者和评论作者的帖子(同时)

时间:2012-07-04 09:22:13

标签: django mongodb mongoengine

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

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

1 个答案:

答案 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()