我现在正在从前端获取文件,并按如下方式设置模型。
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
我的代码怎么了?
答案 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
。