使用Python脚本在Django中保存要上载的文件字段

2024-09-28 01:25:00 发布

您现在位置:Python中文网/ 问答频道 /正文

构建一个应用程序来列出要检查的报告。实际检验报告将提供下载。使用django-db-file-storage将报表保存到数据库。在

要处理的记录很多,所以要编写一个脚本来批量执行所有操作。在管理.pyshell抛出一个错误。在

from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
from inspections.models import InspectionInformation, RestaurantInformation

file = open('/docs/Data/2011/12/12-07-11_1498.pdf', 'r').read()

InspectionInformation(
                insp_rest_permit=RestaurantInformation.objects.get(rest_permit=int('1814')),
                insp_date='2011-12-12',
                insp_score='100',
                insp_inspector='Philip',
                insp_report=default_storage.save('report.pdf', ContentFile(file))
            ).save()

回溯

^{pr2}$

型号

from django.db import models


class RestaurantInformation(models.Model):
    rest_permit = models.IntegerField(unique=True, verbose_name='Permit')
    rest_name = models.CharField(max_length=200, verbose_name='Name')
    rest_address = models.CharField(max_length=200, verbose_name='Address')
    rest_city = models.CharField(max_length=100, verbose_name='City')
    rest_zip = models.IntegerField(verbose_name='Zip Code')
    rest_owner = models.CharField(max_length=200, verbose_name='Owner')
    rest_latitude = models.CharField(max_length=40, verbose_name='Latitude')
    rest_longitude = models.CharField(max_length=40, verbose_name='Longitude')

    class Meta:
        ordering = ['rest_name']

    def __unicode__(self):
        return self.rest_name + ', ' + self.rest_address + ', ' + self.rest_city


class InspectionInformation(models.Model):
    insp_rest_permit = models.ForeignKey(RestaurantInformation, null=False, to_field='rest_permit')
    insp_score = models.DecimalField(verbose_name='Score', decimal_places=2, max_digits=5)
    insp_date = models.DateField(verbose_name='Date')
    insp_inspector = models.CharField(max_length=200, verbose_name='Inspector')
    insp_report = models.FileField(upload_to='restaurants.InspectionFile/bytes/filename/mimetype',
                                   blank=True, null=True, verbose_name='Inspection Report')

    class Meta:
        unique_together = ("insp_rest_permit", "insp_score", "insp_date")
        ordering = ['insp_date']


class InspectionFile(models.Model):
    bytes = models.TextField()
    filename = models.CharField(max_length=255)
    mimetype = models.CharField(max_length=50)

Tags: djangonamefromimportrestverbosemodelsstorage
1条回答
网友
1楼 · 发布于 2024-09-28 01:25:00

1.看起来像数据库文件_存储.存储.保存()要求指定的自定义格式与模型和文件名一起使用,例如。“console.ConsolePicture/bytes/filename/mimetype“+文件名。在

所以作为你的例子,而不是

'report.pdf' 

是的

^{pr2}$

我看了一下文档,不清楚为什么要这样做,因为这违反了DRY,让您输入同一个东西两次,但它们在DatabaseFileStorage类中使用相同的格式。在

2.看起来save方法(第60行)中有一个bug,其中

mimetype = content.file.content_type

应改为

mimetype = content.content_type

您传递给它的文件应该是具有content_type属性的文件,因此可能是Django SimpleUploadedFile:

from django.core.files.uploadedfile import SimpleUploadedFile
file_ = SimpleUploadedFile('report.pdf', open('/docs/Data/2011/12/12-07-11_1498.pdf', 'r').read())  

我认为这是一个bug是因为当我试图传入一个模拟对象时content.file.content_类型“后来我遇到了一个Python内核库异常。在

相关问题 更多 >

    热门问题