创新互联Django4.0教程:Django4.0管理文件-在模型中使用文件

当你使用 ​FileField ​或 ​ImageField​ 时,Django 提供了一组处理文件的API。

成都创新互联是一家专业提供宛城企业网站建设,专注与网站制作、成都网站建设、H5高端网站建设、小程序制作等业务。10年已为宛城众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。

考虑下面的模型,使用 ​ImageField ​来存储照片:

from django.db import models

class Car(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    photo = models.ImageField(upload_to='cars')
    specs = models.FileField(upload_to='specs')

任何 Car 实例将拥有一个 photo 属性,你可以使用它来获取附加照片的详情:

>>> car = Car.objects.get(name="57 Chevy")
>>> car.photo

>>> car.photo.name
'cars/chevy.jpg'
>>> car.photo.path
'/media/cars/chevy.jpg'
>>> car.photo.url
'http://media.cdxwcx.com/cars/chevy.jpg'

注解:文件在数据库中作为保存模型的一部分,因此在模型被保存之前,不能依赖磁盘上使用的实际文件名。

car.photo 是一个 File 对象,这意味着它拥有下面所描述的所有方法和属性。

例如,您可以通过将文件名设置为相对于文件存储位置的路径来更改文件名(如果你正在使用默认的 ​FileSystemStorage ​,则为 ​MEDIA_ROOT ​)。

>>> import os
>>> from django.conf import settings
>>> initial_path = car.photo.path
>>> car.photo.name = 'cars/chevy_ii.jpg'
>>> new_path = settings.MEDIA_ROOT + car.photo.name
>>> # Move the file on the filesystem
>>> os.rename(initial_path, new_path)
>>> car.save()
>>> car.photo.path
'/media/cars/chevy_ii.jpg'
>>> car.photo.path == new_path
True

要将磁盘上的现有文件保存到 ​FileField​:

>>> from pathlib import Path
>>> from django.core.files import File
>>> path = Path('/some/external/specs.pdf')
>>> car = Car.objects.get(name='57 Chevy')
>>> with path.open(mode='rb') as f:
...     car.specs = File(f, name=path.name)
...     car.save()

虽然 ​ImageField ​非图像数据属性(例如高度、宽度和大小)在实例上可用,但如果不重新打开图像,则无法使用底层图像数据。 例如:

>>> from PIL import Image
>>> car = Car.objects.get(name='57 Chevy')
>>> car.photo.width
191
>>> car.photo.height
287
>>> image = Image.open(car.photo)
# Raises ValueError: seek of closed file.
>>> car.photo.open()

>>> image = Image.open(car.photo)
>>> image

网站名称:创新互联Django4.0教程:Django4.0管理文件-在模型中使用文件
网页URL:http://www.mswzjz.cn/qtweb/news19/538119.html

攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能