【问题标题】:django limit number of items that can be created by user - user packagesdjango 限制用户可以创建的项目数 - 用户包
【发布时间】:2017-05-13 10:01:54
【问题描述】:

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

您知道,对于一些列表网站,如 房地产产品销售网站,有一些用户包:免费会员(1 项)、银牌会员(3件)和金卡会员(10件)。每种类型的用户都可以创建有限数量的分配给该包裹的物品。不允许他们创建超出包允许的内容。

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

如何用 django 做这个“用户 - 打包东西”?我应该如何寻找它?

【问题讨论】:

    标签: python django


    【解决方案1】:

    这类事情最好在数据库级别实现。使用包括 Postgresql 在内的许多数据库支持的约束。第二个最佳选择仍然是在数据库级别,但使用触发器代替(例如在 mysql 上)。最后的手段是通过覆盖模型中的保存方法来做到这一点。

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

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

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

    完成所有这些之后,很可能有人通过使用 DB shell 插入记录来搞砸事情 - 正如已经提到的触发器或约束的用户可以避免这种情况。

    【讨论】:

    • 非常感谢您的回答,亲爱的@e4c5,对于我迟到的回复感到抱歉。我还没有尝试过,但它给了我主要的想法。
    【解决方案2】:

    我不知道有什么模块可以开箱即用地为您执行此操作(但其他人可能会这样做),但使用类似这样的东西应该相对容易实现:

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

    【讨论】:

    • 感谢@Geotob。我想我在这里得到了重点。我会努力,我希望我能成功! (抱歉我的回复晚了)
    猜你喜欢
    • 2012-08-02
    • 2023-04-02
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 2014-06-04
    • 2021-03-17
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多