有没有一种方法可以将模型字段的值作为参数传递给模型中的Model.ImageField(storage = function)

时间:2020-03-28 16:25:07

标签: django python-3.x amazon-s3 django-models django-model-field

class StorageModel(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name="profile", null=False)
    file_meta = models.ImageField(storage=UserDataStorage(profile=user), blank=False, null=False)



class UserDataStorage(S3Boto3Storage):
    location = common.AWS_LOCATION_TEST
    file_overwrite = False

    def __init__(self, *args, **kwargs):
        for k, v in kwargs.items():
            print("omg")
            print(v)

        super(UserDataStorage, self).__init__(*args, **kwargs)

如何将字段user作为对象UserDataStorage的参数传递?

这里的问题是,字段user被传递为UserDataStorage,但类型为<django.db.models.fields.related.ForeignKey>。我要在这里配置文件实例。

这在Django中可以实现吗?

1 个答案:

答案 0 :(得分:1)

这不可能是您描述的方式。目前(初始化代码时)没有要发送的请求/用户对象。

您可以按照文档中的说明将可调用对象传递给upload_to kwarg。

这样,在执行可调用对象时,将保存模型实例,并且此实例具有用户属性。

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)


class StorageModel(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name="profile", null=False)
    file_meta = models.ImageField(
        upload_to=user_directory_path,
        storage=UserDataStorage(), 
        blank=False, null=False
    )