Неверный путь для сохранения файла в Django - PullRequest
0 голосов
/ 12 октября 2018

Я сейчас получаю файл из моего внешнего интерфейса и задаю свою модель следующим образом.

model.py

class User(models.Model):
    name = models.CharField(max_length=50)
    image= models.FileField(upload_to='image/', default=None)
    intro= models.FileField(upload_to='info/', default=None)

view.py

class UserViewSet(viewsets.ModelViewSet):
    serializer_class = LsRequestSerializer
    queryset = User.objects.all()
    http_method_names = ['post']

serializers.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
         model = User
         field = '__all__'

     def create(self, validated_data):
         newUser = User.objects.create(
             name = validated_data['name']
             image = validated_date['image']
             intro = validated_date['intro']
         )
         return newUser

Однако, когда я сделал HTTP.POST в Почтальоне, он дал неверный путь для сохранения изображения.

"http://localhost:8000/media/Koala.jpg"

Но исходя из моего дизайнав модели с path_to он должен давать:

"http://localhost:8000/media/image/Koala.jpg"

Обновление: Странно то, что когда я пытался обновить пользователя, дав новое изображение с помощью метода HTTP.Patch, он тогда имел правильный путь,

Обновление: оказывается, проблема в том, что у меня не может быть несколько входных файловых полей и upload_to различных подпапок.Как решить эту проблему?Если я поставлю сериализатор, как указано выше, он может найти правильный путь, но это также означает, что эти два поля обязательны для заполнения.Но на самом деле эти два поля являются необязательными.Но если я помещу оператор if вне функции create, он не сможет определить правильный путь.класс UserSerializer (serializers.ModelSerializer): класс Meta: модель = поле пользователя = ' все '

     def create(self, validated_data):
         newUser = User.objects.create(
             name = validated_data['name']
             image = None
             intro = None
         )
         if validate_data['image']:
            newUser.image = validate_data['image']
         if validate_data['intro']:
            newUser.image = validate_data['intro']
         return newUser

Что не так с моим кодом?

1 Ответ

0 голосов
/ 12 октября 2018

Ну, вы должны сначала проверить, что если вы указали правильный путь для мультимедиа в вашем setting.py, это должно быть что-то вроде этого:

Место, в котором вы хотите хранить эти картинки:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

И так как вы хотите видеть их как "http://localhost:8000/media/whatever/whatever.jpg", вы должны указать MEDIA_URL следующим образом:

MEDIA_URL = '/media/'

И тогда, как вы это сделали в своих моделях, аргумент будет выглядеть так:

upload_to='image/'

Вы также можете узнать больше об этом здесь !

И в качестве дополнительной заметки, если вы хотите работать с изображениями, вы можете использовать ImageField вместоFileField.

...