Как переименовать файл перед сохранением его в базу данных в django rest_framework - PullRequest
1 голос
/ 06 марта 2020

класс GenericAPIView (generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin):

serializer_class = userdataSerializer
queryset = UserData.objects.all()

lookup_field = 'id'


def get(self, request, id=None):
    if id:
        return self.retrieve(request)
    else:
        return self.list(request)

def post(self, request):

    return self.create(request)

def put(self, request, id=None):        
    return self.update(request, id)

////////////// ////// models.py //////////////////////////

class UserData(models.Model):
user = models.OneToOneField(User, default="", on_delete=models.CASCADE)
user_phn = models.IntegerField(default=0)
user_verification_id = models.ImageField(upload_to='users/documents', default="no-img.png")
user_linkedin_id = models.CharField(max_length=200)
user_twitter_id = models.CharField(max_length=200)
user_cv = models.FileField(upload_to='users/cv', default="no-img.png")
user_about = models.CharField(max_length=500)
user_bal = models.FloatField(default=0.0)

class Meta:
    verbose_name_plural = "Userdata"


def __str__(self):
    return str(self.user)

////// /////////////////////// serializer.py ////////////////////////// ///

из rest_framework импорт сериализаторов из users.models import UserData import uuid

user serializer

класс userdataSerializer (serializers.ModelSerializer):

class Meta:
    model = UserData
    fields = ['user_phn','user_verification_id','user_linkedin_id','user_twitter_id','user_cv','user_about','user_bal','user_id']

Я хочу переименовать CV и изображение перед сохранением в базе данных

Ответы [ 2 ]

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

Поскольку вы используете CreateModelMixin, вы можете добавить функцию execute_create к вашей функции просмотра, чтобы настроить изображения и имена файлов.

def perform_create(self, serializer):
    serializer.validated_data['user_verification_id'].name = 'foo_image_name'
    serializer.validated_data['user_cv'].name = 'foo_cv_name'
    serializer.save()
0 голосов
/ 06 марта 2020

Вы можете переименовать ваш файл, используя, назначив функцию для вашего файлового поля, как показано ниже.

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

, и описание поля файла вашей модели должно быть таким, как показано ниже.

user_cv = models.FileField(upload_to=user_directory_path)

Я надеюсь, это тебе поможет :)

...