0
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

这里的问题是, fielduser被传递给UserDataStorage但作为 type <django.db.models.fields.related.ForeignKey>。我想要一个 Profile 实例。

这在 Django 中可以实现吗?

4

1 回答 1

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
    )
于 2020-03-29T07:59:08.550 回答