Django:改变模型的模式(用ImageField替换CharField)

时间:2012-07-30 07:44:46

标签: django django-models

我基于Django框架修改项目。我有表格来添加项目。项目有封面(图像)。该商品的当前版本的商店封面的网址如下:

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。但现有物品怎么样?我想更改模型的架构并保存以前添加的所有图像。我如何才能实现这一目标?

这种修改的一些原因可能会有所帮助。主要原因是为用户提供从计算机上传图像的能力(不仅仅是插入网址)。

TIA!

1 个答案:

答案 0 :(得分:2)

如果cover_url可以拥有现有来源 - 您必须拥有可以处理外部来源的自定义存储空间。

以下是来自django documentationImageField的自定义存储空间使用示例:

from django.db import models
from django.core.files.storage import FileSystemStorage

fs = FileSystemStorage(location='/media/photos')

class Car(models.Model):
    ...
    photo = models.ImageField(storage=fs)

让我们跳出来,我们将获得这样的代码:

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)

它有很大的改进空间 - 这里只显示了想法。