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")
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))
这种事情最好在数据库级别实现。使用许多数据库(包括Postgresql)支持的约束。第二个最好的选择仍然是在数据库级别,但是使用触发器(例如在mysql上)。最后一种方法是在模型中超越save方法。在
这是一种穷人的前插触发器
请注意,要做到万无一失,您必须将整个过程包装在事务中。或者,您可以保存该对象,然后进行计数、删除并在超出该数量时引发异常。在
在完成了所有这些之后,有人很可能通过使用dbshell插入一条记录而把事情搞糟——正如前面提到的,触发器或约束的用户可以避免这种情况。在
我不知道有什么模块可以现成地为您实现这一点(虽然其他人可能会这样做),但使用这样的工具应该相对容易实现:
这假设您在某处有一个
UserProfile
模型,该模型存储了用户的最大帖子数。它可能在你的应用程序中看起来不一样,所以使用它只是为了让你开始。。。在请注意,通过重写
clean()
方法(https://docs.djangoproject.com/en/1.11/ref/models/instances/#django.db.models.Model.clean),您可以利用Django的验证错误,但如果您在代码库的某个地方手动调用instance.save()
,则不会执行该方法。为此,您还需要向save()
方法添加逻辑。在相关问题 更多 >
编程相关推荐