Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 限制每个用户django的用户存储大小_Python_Django_Python 2.7_Django Admin - Fatal编程技术网

Python 限制每个用户django的用户存储大小

Python 限制每个用户django的用户存储大小,python,django,python-2.7,django-admin,Python,Django,Python 2.7,Django Admin,我正在尝试限制用户存储空间我已经设置了外键,但我想知道如何实现这一点。如果有人能给我指出正确的方向,我就卡住了 这是我的模特 class Document(models.Model): docfile = models.FileField(upload_to=only_filename) created_at = models.DateTimeField(auto_now_add=True) user = models.ForeignKey(User, related_n

我正在尝试限制用户存储空间我已经设置了外键,但我想知道如何实现这一点。如果有人能给我指出正确的方向,我就卡住了

这是我的模特

class Document(models.Model):
    docfile = models.FileField(upload_to=only_filename)
    created_at = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, related_name='uploaded_files')

更改设置变量文件\上传\最大\内存\大小以限制最大大小
选中此项

您正试图为用户提供其存储空间的总大小限制?每个用户的金额是相同还是不同

我认为如果它可以是不同的,你首先需要一个或一些其他的模型来跟踪用户的存储限制。或者,如果您只是使所有用户具有相同的限制,则可以跳过创建模型

之后,您将需要一些程序来计算用户使用了多少存储空间。实现这一点的一种方法是将您的
上传到
字段上传到特定于用户的目录,例如:

class Document(models.Model):
    docfile = models.FileField(upload_to=USERNAME + '/' + only_filename)
然后,在上传文件之前的某个地方,您可以这样做(在views.py中?在带有参数的自定义模型验证器中?):

导入操作系统
def get_user_存储(用户名):
user\u files=os.listdir(os.path.join(os.path.abspath(UPLOAD\u path),用户名)
总计=总和(用户_文件中fl的os.path.getsize(fl))
返回总计<无论最大值是多少
一旦你有了这个函数,你就给它一个用户名,如果用户没有超过他们的存储空间,它就会返回
True
,如果用户超过了存储空间,它就会返回
False
。一个大问题是,它会返回
True
,直到用户超过他/她的存储空间,但它并不关心用户超出了多少。因此,如果你将存储空间限制设置为1gb和以前没有上传文件的用户上传的东西是terrabyte,这个函数本身就允许这样做

为了防止这种情况发生,您可以设置最大文件上载限制

我还没有尝试过这些代码,但我认为这可能会让您开始拼凑解决方案

import os
def get_user_storage(username):
    user_files = os.listdir(os.path.join(os.path.abspath(UPLOAD_PATH), username)
    total = sum(os.path.getsize(fl) for fl in user_files)
    return total < WHATEVER_THE_MAXIMUM_IS