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

时间:2017-05-13 10:01:55

标签: python django

我希望我正确输入我的问题标题。我已经检查了很多帖子,但无法找到我需要的内容。

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

这些包可能包含其他规格。还有,像Free(3张),Silver(5张),Gold(10张)等。

如何使用django执行此操作“用户 - 打包”?我应该怎么找?

2 个答案:

答案 0 :(得分:1)

这种事情最好在数据库级别实现。使用包括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")

请注意,要使其变得万无一失,您必须将整个事物包装在事务中。或者,您可以保存对象,然后执行计数,删除并在超出数量时引发异常。

在完成所有这些工作之后,通过使用数据库外壳插入记录,人们很可能会把事情弄糟 - 这可以由用户使用已经提到的触发器或约束来避免。

答案 1 :(得分:0)

我不知道有任何模块可以为您提供开箱即用的功能(但也可能是其他人),但实现起来应该相对容易:

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()方法添加逻辑。