我有一个模型,它有一个ImageField
。
class A(model.Model):
blah = CharField(max_length=10)
profile = ImageField(upload_to='uploads/', null=True, blank=True)
我想为现有数据设置一个默认图像,所以我尝试将文件保存在shell中,如下所示:
>>> myapp.models import A
>>> from django.core.files import File
>>> for a in A.objects.all():
>>> a.profile.save('default.jpg', File(open('/Users/myusername/Pictures/default.jpg', 'rb')))
我很高兴,直到我发现在myprojectroot/media/uploads/
中,defaultblablablah.jpg文件的数量与A
对象的数量一样多。
我想知道是否有任何方法可以像使用update()
方法一样,对所有对象设置相同的图像文件。
有人能给它点光吗?
提前谢谢。
是的,您可以将文件default.jpg
存储在uploads/
目录中,然后用更新对象
A.objects.filter(profile=None).update(profile='uploads/default.jpg')
我还建议使字段不可为null,并使用一个默认值:
class A(model.Model):
blah = CharField(max_length=10)
profile = ImageField(
upload_to='uploads/',
default='uploads/default.jpg',
blank=True
)
在窗帘后面的ImageField
是数据库中的varchar
字段,该字段存储您使用的图像的路径。DjangoImageField
具有额外的逻辑,因此它将其表示为带有一些逻辑的FieldFile
[Django doc],但它以字符串的形式存储在数据库中。
它之所以会生成多个图像,是因为您稍后可以决定编辑其中一个图像。如果是这样的话,所有其他图像都会看到这些编辑。因此,如果文件名";"冲突";,它将复制以防止这种情况发生。但是,如果使用默认图像,则不修改该图像。因此,将文件标记为只读也是一个好主意。