将django中现有对象的默认图像设置为ImageField



我有一个模型,它有一个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],但它以字符串的形式存储在数据库中。

它之所以会生成多个图像,是因为您稍后可以决定编辑其中一个图像。如果是这样的话,所有其他图像都会看到这些编辑。因此,如果文件名";"冲突";,它将复制以防止这种情况发生。但是,如果使用默认图像,则不修改该图像。因此,将文件标记为只读也是一个好主意。

最新更新