Джанго Трясогузка CSV и фото "Upload" - команда управления - PullRequest
0 голосов
/ 27 апреля 2018

Я работаю над командой управления django / wagtail (назовем это «file_upload»), которая примерно выполняет следующие действия:

  • принять аргумент "csv", который является полным путем к CSV-файлу.
  • разобрать и открыть результат с помощью csv
  • для каждой строки, создайте и сохраните пользовательский объект модели Wagtail Image (унаследованный от AbstractImage, с несколькими дополнительными CharField, которые, я не думаю, мешают мне делать то, что я хочу сделать)

(в настоящее время упрощенный) CSV выглядит следующим образом:

1.jpg,Title 1
2.jpg,Title 2

Совсем не сложно, даже прямолинейно ... но этот аспект трясогузки, похоже, не документирован. Следующее не работает:

import csv
import argparse
import os, sys

from django.core.files import File
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.conf import settings

from custom_photo.models import CustomPhoto


class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument('--csv', nargs='?', type=argparse.FileType('r'))

    def handle(self, *args, **options):
        path = os.path.dirname(os.path.realpath(options['csv'].name))
        with options['csv'] as csvfile:
            readCSV = csv.reader(csvfile, delimiter=',')
            for row in readCSV:
                # the file full path assumes everything is flat in the same folder
                with open('%s/%s' %(path, row[0]), 'rb') as f:
                    django_file = File(open)
                    print(django_file)
                    photo = CustomPhoto()
                    photo.title=row[1]
                    # three arguments:
                    # 1) relative path inside MEDIA_ROOT
                    # 2) the django File object
                    # 3) Whether or not we want to save the photo object after the image is saved
                    photo.file.save(row[0], django_file, True)
                    print(photo.__dict__)

запускается так:

python manage.py cca_photo_import --csv=C:\path\to\file\list.csv

и выдать следующую ошибку:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "<snip>env\lib\site-packages\django\core\management\__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "<snip>env\lib\site-packages\django\core\management\__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "<snip>env\lib\site-packages\django\core\management\base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "<snip>env\lib\site-packages\django\core\management\base.py", line 335, in execute
    output = self.handle(*args, **options)
  File "<snip>cca\cca_photo\management\commands\cca_photo_import.py", line 43, in handle
    photo.file.save(row[0], django_file, True)
  File "<snip>env\lib\site-packages\django\db\models\fields\files.py", line 87, in save
    self.name = self.storage.save(name, content, max_length=self.field.max_length)
  File "<snip>env\lib\site-packages\django\core\files\storage.py", line 49, in save
    return self._save(name, content)
  File "<snip>env\lib\site-packages\django\core\files\storage.py", line 268, in _save
    for chunk in content.chunks():
  File "<snip>env\lib\site-packages\django\core\files\base.py", line 71, in chunks
    data = self.read(chunk_size)
  File "<snip>env\lib\site-packages\django\core\files\utils.py", line 16, in <lambda>
    read = property(lambda self: self.file.read)
AttributeError: 'builtin_function_or_method' object has no attribute 'read'

Большое спасибо

1 Ответ

0 голосов
/ 27 апреля 2018

Благодаря gasman , теперь это работает. Duh.

import csv
import argparse
import os, sys

from django.core.files import File
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.conf import settings

from custom_photo.models import CustomPhoto, CustomPhotoPlate, CustomPhotoType


class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument('--csv', nargs='?', type=argparse.FileType('r'))

    def handle(self, *args, **options):
        path = os.path.dirname(os.path.realpath(options['csv'].name))
        with options['csv'] as csvfile:
            readCSV = csv.reader(csvfile, delimiter=',')
            for row in readCSV:
                photo_path = '%s/%s' %(path, row[0])
                with open(photo_path, 'rb') as f:
                    django_file = File(f)
                    photo = CustomPhoto()
                    photo.title=row[1]
                    photo.file = django_file
                    photo.save()
                    print(photo.__dict__)

Объект photo сохранен и т. Д. И т. Д. Все хорошо.

Однако, поле file для этого объекта теперь заполнено:

original_images/CFolderSubFolderSubSubFolderSubSubSubFolder1.jpg

Где CFolderSubFolderSubSubFolderSubSubSubFolder, по-видимому, является очищенной версией C:\Folder\SubFolder\SubSubFolder\SubSubSubFolder

Есть ли способ избавиться от этого (бесполезного) пути? По-видимому, это полный путь к файлу JPG.

Спасибо!

...