Django:改变模式';s架构(用ImageField替换CharField)
我修改了基于Django框架的项目。我有表格要添加一个项目。项目有封面(图像)。此商品商店封面url的当前模型版本如下:Django:改变模式';s架构(用ImageField替换CharField),django,django-models,Django,Django Models,我修改了基于Django框架的项目。我有表格要添加一个项目。项目有封面(图像)。此商品商店封面url的当前模型版本如下: class Item(models.Model): title = models.CharField(max_length = 255, db_index = True) slug = models.CharField(max_length = 80, db_index = True) categories = models.ManyToManyFie
class Item(models.Model):
title = models.CharField(max_length = 255, db_index = True)
slug = models.CharField(max_length = 80, db_index = True)
categories = models.ManyToManyField(Category)
cover_url = models.CharField(max_length = 255, null = True, default = None)
...
重要注意,某些图像存储在其他服务器上(不同的文件宿主)
我想用ImageField替换CharField。但是现有的项目呢?我想更改模型的模式并保存所有以前添加的图像。我怎样才能达到这个目标
也许这种修改的某些原因会有所帮助。主要原因是为用户提供从其计算机上载图像的能力(而不仅仅是按原样插入URL)
蒂亚 如果
cover\u url
可以有现有的源代码-您必须有可以处理外部源代码的自定义存储
以下是ImageField
的自定义存储使用示例,来自:
让我们跳出它,我们将得到如下代码:
from django.db import models
from django.core.files.storage import FileSystemStorage
def is_url(name):
return 'http' in name
class MyStorage(FileSystemStorage):
#We should override _save method, instead of save.
def _save(self, name, content=None):
if content is None and is_url(name):
return name
super(MyStorage, self)._save(name, content)
fs = MyStorage()
class Item(models.Model):
title = models.CharField(max_length = 255, db_index = True)
slug = models.CharField(max_length = 80, db_index = True)
categories = models.ManyToManyField(Category)
cover_url = models.ImageField(storage=fs)
它有很大的改进空间-这里显示的是唯一的想法 实际上,您不需要更改模式。
CharField
和ImageField
都作为VARCHAR类型存储在数据库中。唯一真正的区别在于Python方面。我考虑过了。最好的方法是在表单模板中使用另一个小部件。我的意思是-在模型中我有CharField,但在形式上我使用“file”类型。但当我在form的课堂上尝试这样做时,我会遇到一些错误。也许我应该修改表单模板-添加必要类型的输入?不,您希望在模型上有一个实际的ImageField
。我的观点是,将字段从CharField
更改为ImageField
不需要更改模式。
from django.db import models
from django.core.files.storage import FileSystemStorage
def is_url(name):
return 'http' in name
class MyStorage(FileSystemStorage):
#We should override _save method, instead of save.
def _save(self, name, content=None):
if content is None and is_url(name):
return name
super(MyStorage, self)._save(name, content)
fs = MyStorage()
class Item(models.Model):
title = models.CharField(max_length = 255, db_index = True)
slug = models.CharField(max_length = 80, db_index = True)
categories = models.ManyToManyField(Category)
cover_url = models.ImageField(storage=fs)