在 Django 中保存文件的路径不正确
Incorrect path to save the file in Django
我现在从我的前端获取文件并且我这样设置我的模型。
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
但是,当我在 Postman 中执行 HTTP.POST 时,它给出了错误的图像保存路径。
"http://localhost:8000/media/Koala.jpg"
但是根据我在 path_to 模型中的设计,它应该给出:
"http://localhost:8000/media/image/Koala.jpg"
更新:
奇怪的是,当我尝试通过使用 HTTP.Patch 方法提供新图像来更新用户时,它就有了正确的路径。
更新:
结果是我不能有多个输入文件字段和 upload_to 个不同的子文件夹的问题。如何解决这个问题呢?
如果我像上面那样放置序列化器,它可以找到正确的路径,但这也意味着这两个字段是必需的。但实际上,这两个字段是可选的。
但是如果我将 if 语句放在 create 函数之外,它就无法检测到正确的路径。
class UserSerializer(serializers.ModelSerializer):
class 元:
模型 = 用户
field = 'all'
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
我的代码有什么问题?
那么你应该首先检查你是否在 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/'
您还可以阅读更多相关内容 here!
另外,如果你想处理图片,那么你可以使用 ImageField
而不是 FileField
。
我现在从我的前端获取文件并且我这样设置我的模型。
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
但是,当我在 Postman 中执行 HTTP.POST 时,它给出了错误的图像保存路径。
"http://localhost:8000/media/Koala.jpg"
但是根据我在 path_to 模型中的设计,它应该给出:
"http://localhost:8000/media/image/Koala.jpg"
更新: 奇怪的是,当我尝试通过使用 HTTP.Patch 方法提供新图像来更新用户时,它就有了正确的路径。
更新: 结果是我不能有多个输入文件字段和 upload_to 个不同的子文件夹的问题。如何解决这个问题呢? 如果我像上面那样放置序列化器,它可以找到正确的路径,但这也意味着这两个字段是必需的。但实际上,这两个字段是可选的。 但是如果我将 if 语句放在 create 函数之外,它就无法检测到正确的路径。 class UserSerializer(serializers.ModelSerializer): class 元: 模型 = 用户 field = 'all'
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
我的代码有什么问题?
那么你应该首先检查你是否在 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/'
您还可以阅读更多相关内容 here!
另外,如果你想处理图片,那么你可以使用 ImageField
而不是 FileField
。