1

私はデータベースとしてDjangoとMongoDBを使用してWebプロジェクトに取り組んでいます(MongoEngineを使用してそれらを接続しています)。古いユーザーアカウントをクリーンアップするためにCeleryタスクを作成する必要があります。1か月後にコンテンツのない怠惰なユーザーアカウントのみをクリーンアップする必要があります(怠惰なユーザーは、最初にWebサイトに接続したときに自動的に作成されたユーザーです)。コンテンツとして何がカウントされますか?ユーザーからの投稿または投稿へのコメント。

私はこのようにしましたが、可能であればこれをクエリに変換したいと思います。

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

うまくいけば、私はあなたが問題で私を助けることができるように十分な情報を提供しました。ありがとう!

4

1 に答える 1

0

これをきれいにする方法はいくつかあると思います。

次のような方法で、投稿のすべての作成者の一意の ID を取得できます。

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

scalarはドキュメント オブジェクトではなく著者 ID のリストを提供し、distinct はそれらが一意であることを確認する必要があります。これにより、pythonで行っていることがmongodbにプッシュされます

その後、Users のクエリを作成できます。前の日付を日付に変更する必要があります。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 に答える