Django限制用户用户包可以创建的项目数

2024-09-30 06:22:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望我的题目打对了。我已经检查了很多帖子,但找不到我需要的东西。在

你知道,对于一些上市网站,如房地产产品销售网站有一些用户套餐:免费会员(1件)、银牌会员(3件商品)和黄金会员(10件)。。每种类型的用户可以创建为该包分配的有限数量的项目。不允许他们创建超出包允许范围的内容。在

这些包可能包含其他规范。还有,如免费(3张照片)、银色(5张照片)、金色(10张照片)等

如何用django来完成“用户包的事情”?我该怎么找呢?在


Tags: 项目用户规范类型内容数量网站照片
2条回答

这种事情最好在数据库级别实现。使用许多数据库(包括Postgresql)支持的约束。第二个最好的选择仍然是在数据库级别,但是使用触发器(例如在mysql上)。最后一种方法是在模型中超越save方法。在

这是一种穷人的前插触发器

def save(self, *args, **kwargs):
   if MyModel.objects.filter(user_profile=self.user_profile).count() < X:
      return super(MyModel,self).save(*args,**kwargs)

   raise ValidationError("Too many records mate")

请注意,要做到万无一失,您必须将整个过程包装在事务中。或者,您可以保存该对象,然后进行计数、删除并在超出该数量时引发异常。在

在完成了所有这些之后,有人很可能通过使用dbshell插入一条记录而把事情搞糟——正如前面提到的,触发器或约束的用户可以避免这种情况。在

我不知道有什么模块可以现成地为您实现这一点(虽然其他人可能会这样做),但使用这样的工具应该相对容易实现:

from django.core.exceptions import ValidationError
from django.db import models

class BlogPost(models.Model):
    user_profile = models.ForeignKey('module.UserProfile')

    def clean(self):
        numPosts = BlogPost.objects.filter(user_profile=self.user_profile).count()
        if numPosts > self.user_profile.max_posts:
            raise ValidationError("Your user plan does not support more than {} posts".format(numPosts))

这假设您在某处有一个UserProfile模型,该模型存储了用户的最大帖子数。它可能在你的应用程序中看起来不一样,所以使用它只是为了让你开始。。。在

请注意,通过重写clean()方法(https://docs.djangoproject.com/en/1.11/ref/models/instances/#django.db.models.Model.clean),您可以利用Django的验证错误,但如果您在代码库的某个地方手动调用instance.save(),则不会执行该方法。为此,您还需要向save()方法添加逻辑。在

相关问题 更多 >

    热门问题