django ImageField未通过django rest framework将文件保存在正确的目录中
发送post请求时,图像保存在media/user\u None/pic/1602746423.311224\u profile.png中,而不是media/user\u{id}/pic/1602746423.311224\u profile.pngdjango ImageField未通过django rest framework将文件保存在正确的目录中,django,django-rest-framework,Django,Django Rest Framework,发送post请求时,图像保存在media/user\u None/pic/1602746423.311224\u profile.png中,而不是media/user\u{id}/pic/1602746423.311224\u profile.png HTTP 201 Created Allow: POST, OPTIONS Content-Type: application/json Vary: Accept { "username": "ramver
HTTP 201 Created
Allow: POST, OPTIONS
Content-Type: application/json
Vary: Accept
{
"username": "ramverma",
"email": "ram@gmail.com",
"mobile_num": null,
"first_name": "Ram",
"middle_name": "",
"last_name": "Verma",
"dob": null,
"doj": null,
"sex": "m",
"department": 6,
"profile_pic": http://localhost:8000/media/user_None/pic/1602764174.8516657_ProfiePic.png
}
**1st Issue**
教师模式
class Teacher(AbstractUser):
profile_pic = models.ImageField(verbose_name="Profile Picture",blank=True,null=True,upload_to=file_pic,default='default.png')
middle_name = models.CharField(max_length=30, blank=True, null=True)
dob = models.DateField(verbose_name='Date Of Birth', null=True)
doj = models.DateField(verbose_name='Date Of Join', null=True)
mobile_num = models.CharField(verbose_name='Mobile Number',max_length=10,null=True,blank=True)
SEX_CHOICE = (
('m','Male'),
('f','Female'),
('t','Transgender'),
('o','Others')
)
sex = models.CharField(max_length=1,choices=SEX_CHOICE,default='m')
department = models.ForeignKey('Department',on_delete=models.SET_NULL,null=True)
用于ImageField的文件\u pic功能,用于根据其id将照片保存在用户文件夹中
def file_pic(instance, filename):
return 'user_{0}/pic/{2}_{1}'.format(instance.id, filename, time.time())
用于教师创建的序列化程序
class TeacherCreateSerializer(ModelSerializer):
password2 = CharField(write_only=True, style={'input_type':'password'})
class Meta:
model = Teacher
fields = [
'username',
'email',
'mobile_num',
'first_name',
'middle_name',
'last_name',
'dob',
'doj',
'sex',
'department',
'profile_pic',
'password',
'password2'
]
extra_kwargs = {
'password' : {'write_only':True, 'style':{'input_type':'password'}}
}
def create(self,validated_data):
vd_cpy = validated_data
password1 = vd_cpy['password']
password2 = vd_cpy['password2']
vd_cpy.pop('password2')
vd_cpy.pop('password')
teacher = Teacher(**vd_cpy)
if(password1!=password2):
raise ValidationError('password doesn\'t match')
teacher.set_password(password1)
teacher.save()
return validated_data
def validate_mobile_num(self,value):
value = self.initial_data.get('mobile_num',None)
if value is None or len(value) == 0:
return None
if(re.search(r'^((\+?91|0)?){1}[1-9]{1}[0-9]{9}$',value) is None):
raise ValidationError('Invalid Mobile Number')
return value
def validate_email(self,value):
if(Teacher.objects.filter(email=value).exists()):
raise ValidationError('email already registered')
return value
class TeacherCreateAPIView(CreateAPIView):
queryset = Teacher.objects.all()
serializer_class = TeacherCreateSerializer
permission_classes = [AllowAny]
parser_classes = (JSONParser,FormParser,MultiPartParser)
教师创建的APView
class TeacherCreateSerializer(ModelSerializer):
password2 = CharField(write_only=True, style={'input_type':'password'})
class Meta:
model = Teacher
fields = [
'username',
'email',
'mobile_num',
'first_name',
'middle_name',
'last_name',
'dob',
'doj',
'sex',
'department',
'profile_pic',
'password',
'password2'
]
extra_kwargs = {
'password' : {'write_only':True, 'style':{'input_type':'password'}}
}
def create(self,validated_data):
vd_cpy = validated_data
password1 = vd_cpy['password']
password2 = vd_cpy['password2']
vd_cpy.pop('password2')
vd_cpy.pop('password')
teacher = Teacher(**vd_cpy)
if(password1!=password2):
raise ValidationError('password doesn\'t match')
teacher.set_password(password1)
teacher.save()
return validated_data
def validate_mobile_num(self,value):
value = self.initial_data.get('mobile_num',None)
if value is None or len(value) == 0:
return None
if(re.search(r'^((\+?91|0)?){1}[1-9]{1}[0-9]{9}$',value) is None):
raise ValidationError('Invalid Mobile Number')
return value
def validate_email(self,value):
if(Teacher.objects.filter(email=value).exists()):
raise ValidationError('email already registered')
return value
class TeacherCreateAPIView(CreateAPIView):
queryset = Teacher.objects.all()
serializer_class = TeacherCreateSerializer
permission_classes = [AllowAny]
parser_classes = (JSONParser,FormParser,MultiPartParser)
注册后,DRF API资源管理器会显示什么
HTTP 201 Created
Allow: POST, OPTIONS
Content-Type: application/json
Vary: Accept
{
"username": "ramverma",
"email": "ram@gmail.com",
"mobile_num": null,
"first_name": "Ram",
"middle_name": "",
"last_name": "Verma",
"dob": null,
"doj": null,
"sex": "m",
"department": 6,
"profile_pic": http://localhost:8000/media/user_None/pic/1602764174.8516657_ProfiePic.png
}
**1st Issue**
**配置文件pic保存在文件夹user\u none中,但它应该保存在user{user.id}中,如文件pic函数中所述。其想法是将与用户相关的所有内容保存在一个文件夹中
{
"profile_pic": "http://localhost:8000/media/user_None/pic/1602764174.8516657_ProfiePic.png",
"first_name": "Ram",
"last_name": "Verma",
"username": "ramverma",
"url": "http://localhost:8000/api/teacher/23"
}
第二期
若POST请求中未给出配置文件pic,则配置文件_pic值将设置为null,而不是模型中ImageField中提供的默认值
当API交互完成时,这两个问题都会发生。在web交互中,这个问题不会持续下去。如果您想访问对象id,您必须先保存它(),因为之前无法知道它。然后可以通过调用来更新ImageField 我不确定默认图像的问题