管理者がzipファイルをアップロードできるようにするシステムを作成しようとしていますが、signals
を使用してスクリプトが自動的に解凍され、jpg,png
のすべてのファイルを検索します。 list
を作成し、それに従ってデータベースレコードを生成します。モデルでDjangoファイルを解凍し、データベースに内容を追加します
、私はPhoto
がProject
とMany-to-One
Foreign Key
別名関係にあり、Project
とPhoto
テーブルを持っています。
以下のスクリプトは私が働いている信号です。私はエラーなしで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()
更新
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)
あるエラーは何ですか? – Dominik
あなたの投稿に誤りがあれば何でも追加してください。 'post_save'や' Project'のように、エラーに実際に関連する他のコードも追加してください。 – agf
サイレントエラーを発生させる信号に接続されています。エラーは表示されませんが、データベースエントリは作成されませんが、抽出およびファイルリスト/フィルタリングが行われます。私はかなりProjectクラスは無関係だと確信していますが、私は2番目に追加します。 –