首页 > 解决方案 > 限制用户帖子/天 django(就像 stackoverflow 所做的那样)

问题描述

这是我的帖子模型

class Post(models.Model):
    title = models.CharField(max_length=40, blank=True, null=True)
    description = models.TextField(null=True, blank=True)
    image = models.ImageField(upload_to='comments/posts_images/', null=True, blank=True)
    post_file = models.FileField(upload_to='comments/file_uploades/', blank=True, null=True)
    category = models.ForeignKey(
        Category, on_delete=models.CASCADE,)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    # Voting
    likes = models.ManyToManyField(User, related_name='post_like', blank=True)
    dislikes = models.ManyToManyField(User, related_name='post_dislike', blank=True)
    # AUTO
    post_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'Post by user: {self.user}'

这是我的用户模型:

class User(AbstractUser):
    friends = models.ManyToManyField('User', blank=True)
    bio = models.CharField(
        max_length=400, default='I love this website!', blank=True, null=True,)
    avatar = models.ImageField(
        upload_to='profile_images', default='profile_images/DefaultUserImage.jpg',)
    ...

    allow_friend_request = models.BooleanField(default=True)

    # MAX SENDING
    max_posts = models.IntegerField(default=0)

现在在views.py中:

def create_post(request, pk):
    category = get_object_or_404(Category, pk=pk)
    #! NOT SERIALIZING IMAGES
    # Images category
    if request.user.max_posts >= 3:
        messages.error(
            request, f'You can only make 3 posts a day, please wait till tommorow')
        return redirect('categories:view_category', pk=pk)
    else:
        # if pk == 1:
        #     image = request.GET.get('image')
        #     description = request.GET.get('description')
        #     if image:
        #         if description:
        #             post = Post(description=description, image=image,
        #                         user=request.user, category=category)
        #             post.save()
        #         else:
        #             post = Post(description=description,
        #                         user=request.user, category=category)
        #             post.save()
        #     else:
        #         # todo return error
        #         pass
        #  Fun Area Category
        if pk == 2:
            post = Post(user=request.user, category=category)
            if request.POST['description']:
                post.description = request.POST['description']
                post.save()
                request.user.max_posts += 1
                messages.warning(request, request.user.max_posts)
            if request.POST['image'] and request.POST['post_file']:
                messages.error(request, 'You can\'t have both image and file')
            elif request.POST['image']:
                post.image = request.POST['image']
                post.save(instance=post)
                
            elif request.POST['post_file']:
                post.post_file = request.POST['post_file']
                post.save(instance=post)
                

            return redirect('categories:view_category', pk=category.id)

(我知道views.py中的代码看起来很脏,我真的很感激它的任何帮助)我想要实现的是当用户创建帖子时,max_posts的数量增加1,但这不会发生第二件事是每 24 小时所有用户 max_posts 字段都返回零,我不知道如何实现这一点。

标签: javascriptpythondjango

解决方案


您不需要保存用户发布的帖子数量,您可以执行查询来计算用户在最后一天发布的帖子数量

import datetime
from django.utils.timezone import now

def create_post(request, pk):
    posts_in_last_24_hours = request.user.post_set.filter(
        post_date__gt=now() - datetime.timedelta(days=1)
    )
    if post_in_last_24_hours.count() >= 3:
        # Throw error

由于您可能会定期执行此查询,因此最好在这两个字段上添加索引

class Post(models.Model):

    class Meta:
        indexes = [
            models.Index(fields=['user', 'post_date']),
        ] 

推荐阅读