Не удается прочитать Django FileField? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь прочитать из Django Filefield , как видно из моей модели Django:

import os
import win32api

from django.db import models
from custom.storage import AzureMediaStorage as AMS

class File(models.Model):
    '''
    File model
    '''
    file = models.FileField(blank=False, storage=AMS(), null=False)
    timestamp = models.DateTimeField(auto_now_add=True)
    remark = models.CharField(max_length=100, default="")

class File_Version(File):
    """
    Model containing file version information
    """
    version = models.CharField(max_length=25, default="")

    @property
    def get_version(self):
        """
        Read all properties of the given file and return them as a dictionary
        """   

        props = {'FileVersion': None}

        # To check if the file exists ?
        ### This returns FALSE
        print("Is the file there? ", os.path.isfile(str(File.file)) )

        # To get file version info
        fixedInfo = win32api.GetFileVersionInfo(str(File.file), '\\')
        print("FixedInfo: ", fixedInfo)

Но os.path.isfile () продолжает возвращать False .Как мне прочитать из FileField, в мою пользовательскую модель?

И, кроме того, строка fixedInfo выдает ошибку:

pywintypes.error: (2, 'GetFileVersionInfo: GetFileVersionInfoSize', 'Система не можетнайти указанный файл. ')

Ответы [ 3 ]

0 голосов
/ 28 марта 2019

В определении вашей модели вы можете добавить:

class File(models.Model):
    file = models.FileField()
    ...
    ...

    def filename(self):
        return os.path.basename(self.file.name)

Или вы можете попробовать:

из django.core.files.storage import default_storage

Использование: 1) FieldFile.name:

Имя файла, включая относительный путь из корня хранилища соответствующего FileField.

2) default_storage.exists (path)

Возвращает True, если файл, на который ссылается данное имя, уже существует в система хранения или False, если имя доступно для нового файла.

Надеюсь, это работает!

0 голосов
/ 30 марта 2019

Поскольку вы используете другой поставщик хранилища для своих файлов, вам необходимо использовать методы этого поставщика хранилища для запроса объекта файла.

os.path.isfile и win32api.GetFileVersionInfo работают только для локального файласистема.

0 голосов
/ 28 марта 2019

os.path.isfile возвращает, указывает ли путь к файлу (например, в отличие от каталога).File.file указывает на объект models.FileField;текущий код всегда будет возвращать False.Я полагаю, вы хотите, чтобы File.file.path получил фактический абсолютный путь к файлу.

...