Django распаковать файл, добавить содержимое в базу данных - PullRequest
0 голосов
/ 09 августа 2011

Я пытаюсь создать систему, которая позволяет администратору загружать zip-файл, затем сценарий автоматически, используя signals, разархивирует его, найдет все файлы в jpg,png.создайте list из них и сгенерируйте запись базы данных в соответствии с ней.

В моделях у меня есть таблица Project и Photo, Photo имеет Many-to-One aka Foreign Key связь с Project.

Сценарий ниже с сигналом, с которым я работаю.Я могу получить instance.file_zip.path без ошибок, и сценарий хорошо работает при запуске вручную.

Длительная отладка, и я предполагаю, что с belongs_to=instance что-то не так, но я не знаю, как это исправить, так какЯ на самом деле не понимаю, почему это дает ошибкуЧасть извлечения работает нормально, я просто поместил их здесь для справки, скорее всего вам не нужно будет читать и понимать ее.

@receiver(post_save, sender=Project)
def unzip_and_process(sender, instance, **kwargs):
    #project_zip = FieldFile.open(file_zip, mode='rb')
    file_path = instance.file_zip.path
    file_list = []
    with zipfile.ZipFile(file_path, 'r') as project_zip:
        project_zip.extractall(re.search('[^\s]+(?=\.zip)', file_path).group(0))
        project_zip.close()
    for root, dirs, files in os.walk(file_path):
        for filename in files:
            file_list.append(os.path.join(root, filename))
    photo_list = filter(filter_photos, file_list)
    for photo in photo_list:
        print 'Processing %s'%photo
        p = Photo.objects.create(belongs_to=instance, img=photo, desc='Processed from zipfile')
        p.save()

update

class Project(models.Model):
    project_name=models.CharField(max_length=150)
    date_taken=models.DateField()
    date_deadline=models.DateField()
    price=models.FloatField()
    price_paid=models.BooleanField()
    owner=models.ForeignKey(User)
    file_zip=models.FileField(upload_to='projects/%Y/%m/%d')

    def __unicode__(self):
        return self.project_name

    def file_path(self):
        return re.search('[^\s]+(?=\.zip)', self.file_zip.name).group(0)

class Photo(models.Model):

    def project_path(instance, filename):
        return '%s/%s'%(instance.belongs_to.file_path(),filename)

    belongs_to=models.ForeignKey(Project, verbose_name="related_project")
    img=models.ImageField(upload_to=project_path, max_length=255)
    desc=models.CharField(max_length=255)

    def __unicode__(self):
        return '%s FROM [%s]'%(self.img.name,self.belongs_to)

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

У django-photologue есть что-то извлеченное из того, что вы хотите, и они создали подобный хак для загрузки zipfile.

Ссылка: http://code.google.com/p/django-photologue/, если вы не хотите, чтобы Google

Более того, класс загрузки zip - GalleryUpload (models.Model)

1 голос
/ 10 августа 2011
for root, dirs, files in os.walk(file_path):

file_path относится к файлу zip. не directory следовательно os.walk ничего не возвращает

...