私はDjangoImageFieldを持つクラスを持っていて、そのフィールドのupload_to
関数を格納するための2つの選択肢のどちらかを決めるのに苦労しています。最初のアプローチは非常に簡単です。関数はモジュールレベルで定義されています( https://stackoverflow.com/a/1190866/790075、https://stackoverflow.com/a/3091864/790075を参照):
def get_car_photo_file_path(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext) # chance of collision <1e-50
return os.path.join('uploads/cars/photos', filename)
class CarPhoto(models.Model):
photo = models.ImageField(upload_to=get_car_photo_file_path)
これは単純で理解しやすいですが、実際にはCarPhotoクラスにのみ関連する関数を追加することにより、モジュールスコープを汚染します。
2番目のアプローチでは、呼び出し可能クラスパターンを使用して、関数をCarPhotoクラスとより密接に関連付けます。これにより、upload_to
関数はモジュールスコープの外に移動しますが、不必要に複雑に感じられます。
class CarPhoto(models.Model):
class getCarPhotoFilePath():
# Either use this pattern or associate function with module instead of this class
def __call__(self, instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext) # chance of collision <1e-50
return os.path.join('uploads/cars/photos', filename)
photo = models.ImageField(upload_to=getCarPhotoFilePath())
@staticmethod
と@classmethod
デコレータを使用するための提案を見てきましたが( https://stackoverflow.com/a/9264153/790075を参照)、これを実行すると、関数が実行されず、ファイル名が次のようになります/path/to/file/<classmethod object>
。ファイルパスに埋め込まれたオブジェクト。これは確かに意図されたものではありません。
これらのどれが好ましいパターンですか?もっと良い方法はありますか?