有没有办法将模型字段的值作为参数传递给同一模型中的 models.ImageField(storage=function)

Is there a way to pass the value of a model field as a parameter to models.ImageField(storage=function) within same Model

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>。我想要一个 Profile 实例。

这在 Django 中可以实现吗?

不可能像你描述的那样。此时(初始化代码时)没有要发送的 request/user 个对象。

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

这样当callable被执行时,你会得到模型实例被保存,这个实例有用户属性。

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
    )