DjangoBrothers BLOG ✍️

2021/02/17

このエントリーをはてなブックマークに追加
Django FileField File FactoryBoy

FactoryBoy 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.'