在Django中保存文件的路径错误

时间:2018-10-12 16:32:44

标签: python django django-models django-file-upload django-media

我现在正在从前端获取文件,并按如下方式设置模型。

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方法提供新图像来更新用户时,它具有正确的路径。

更新:     原来是一个问题,我不能有多个输入filefield和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 :(得分:1)

首先,应该检查一下,如果您在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