Django:改变模式';s架构(用ImageField替换CharField)

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

我修改了基于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.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)