2021/02/17
Django FileField File FactoryBoyFactoryBoy FileFieldにファイルコンテンツ指定してデータ生成
バージョン
- Django 3.1.5
- Python 3.8.4
- FactoryBoy 3.2.0
FactoryBoyでFileFieldの値を指定する方法についてです。
以下のようにFileFieldを使ったモデルを想定しています。
models.py
class MyModel(models.Model):
hoge_file = models.FileField()
FactoryBoyでは、FileFieldに対して文字列を値として指定できます。
FileFieldに文字列を指定する
>>> my_model_data = MyModelFactory(hoge_file="test.pdf")
>>> my_model_data.hoge_file
<FieldFile: test.pdf>
>>> my_model_data.hoge_file.path
'/base_dir/media/test.pdf'
>>> my_model_data.hoge_file.url
'/media/test.pdf'
# ファイルオブジェクトは取得できない
>>> my_model_data.hoge_file.file
*** FileNotFoundError: [Errno 2] No such file or directory: '/base_dir/media/test.pdf'
文字列を指定した場合、pathやurl属性は取得できますが、MEDIAディレクトリにファイルは生成されませんし、fileを取得したりopenやreadすることもできません。
ファイル操作もしたい場合は、ContentFileを指定すると良いです。
FileFieldにContentFileを指定する
>>> from django.core.files.base import ContentFile
>>> my_model_data = MyModelFactory(file=ContentFile(b"file content.", "test.pdf"))
>>> my_model_data.hoge_file.file
'FieldFile: media/uploads/test.pdf'
# ファイルオブジェクトに対する各操作ができる
>>> my_model_data.hoge_file.file.open()
<File: /base_dir/media/uploads/test.pdf >
>>> my_model_data.hoge_file.file.read()
b'file content.'