带有tempfile的Django ImageField

时间:2018-08-11 19:38:25

标签: django file testing model

伙计们,我需要帮助来了解有关Django如何保存模型文件的一些详细信息。我编写了一个涉及创建文件的测试(通过tempfile在临时目录中),并且具有以下几行:

TEMP_DIR = tempfile.TemporaryDirectory()
TEMP_DIR_PATH = TEMP_DIR.name
...

@override_settings(MEDIA_ROOT=TEMP_DIR_PATH)
def create_photo(self, album_number, photo_number):
    ...
    p = Photo.objects.create(
        number=photo_number,
        album=album,
        added_by=self.user,
        image=SimpleUploadedFile(
            name=...,
            content=open(..., 'rb').read(),
            content_type='image/jpeg'
        ),
        remarks='-'
    )
    p.full_clean()
    p.save()
    return p

除了使我困惑的一件事之外,此代码有效。行p = Photo.objects.create使文件出现在临时目录中。然后p.full_clean()对文件不执行任何操作。但是,当我执行p.save()时,文件将从临时目录中消失。如果删除p.save(),则函数返回时文件将保留在该位置。

所以我的测试功能

def test_image_file_present(self):
    """When a photo is added to DB, the file actually appears in MEDIA."""
    p = self.create_photo(3, 2)
    image_filename = p.image.file.name
    if not os.path.exists(image_filename):
        self.fail('Image file not found')

如果有p.save(),则失败,但如果我删除p.save(),则通过。

为什么object.save()会导致文件消失?

作为一个额外的问题,如果文件和Django模型对象已经在.save()中出现,Photo.objects.create的目的是什么?我检查了pre-savePhoto.object.create()是否发送了p.save()信号。

0 个答案:

没有答案