Есть ли способ передать значение поля модели в качестве параметра для моделей. ImageField (storage = function) в той же модели - PullRequest
0 голосов
/ 28 марта 2020
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 Ответ

1 голос
/ 29 марта 2020

Невозможно, как вы это описываете. В данный момент (когда код инициализируется) нет запросов / пользовательских объектов для отправки.

Что вы можете сделать, это передать вызов вызываемому 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
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...