我正在尝试在SQLAlchemy中创建一个自定义字段来管理Flask应用程序中的上传文件。我基本上试图实现类似于Django的FileField。
所以我希望能够做到的是,给出一个模型:
class TestModel(Base):
__tablename__ = "testmodel"
id = Column(Integer(), primary_key=True)
profile_photo = Column(FileField(upload_set, 100))
我希望能够做到这样的事情:
m = TestModel()
m.profile_photo.save(request.files["profile_photo"])
models.db.session.add(m)
models.db.session.commit()
我所拥有的是基于内置的String类型,其工作方式如下:
class FileField(types.TypeDecorator):
impl = String
def __init__(self, upload_set, *args, **kwargs):
super(FileField, self).__init__(*args, **kwargs)
self.upload_set = upload_set
def process_bind_param(self, value, dialect):
if value is not None:
return value.filename
return value
def process_result_value(self, value, dialect):
return FileNameString(self.upload_set, value)
class FileNameString(object):
def __init__(self, upload_set, filename):
self.upload_set = upload_set
self.filename = filename
def save(self, req_file):
self.filename = self.upload_set.save(req_file)
return self.filename
@property
def url(self):
return self.upload_set.url(self.filename)
当模型存在于数据库中时,这种方法有效,但当profile_photo
属性为None
时,从头开始创建模型时,此方法不起作用。理想情况下,我希望此类型的默认值为空FileField
,尽管我还没弄清楚究竟是什么样子。问题是我无法弄清楚如何为属性创建默认值,而无需在使用FileField
的任何类的构造函数中执行某些操作。
那么,知道如何为profile_photo
属性创建默认值吗?