0

我现在从我的前端获取文件,并像这样设置我的模型。

模型.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)

视图.py

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

序列化程序.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 函数之外,它就无法检测到正确的路径。类 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

我的代码有什么问题?

4

1 回答 1

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/'

您还可以在这里阅读更多相关信息!

作为旁注,如果你想处理图片,那么你可以使用ImageField而不是FileField.

于 2018-10-12T18:07:04.137 回答