Как загрузить несколько файлов изображений в одну модель с помощью фреймворка Django rest?

Я застрял на загрузке нескольких файлов изображений во время создания модели врача. Я думаю, что для реализации множественной загрузки необходимо установить дополнительное поле для загрузки в DoctorSerializer.

Я хочу загрузить несколько изображений для каждого студента, используя django rest framework. В настоящее время я могу загрузить только одно изображение для каждого студента, но я хочу иметь возможность загрузить несколько изображений для каждого врача в папку uploads в директории с их именем. Я создаю систему распознавания посещаемости по лицу, и мне нужно несколько изображений каждого студента. вот мой файл models.py.

Models.py

class Doctor(models.Model):

def get_upload_path(instance, filename):
    return 'documents/{0}/{1}'.format(instance.name, filename)

mobile_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Up to 15 digits allowed.")
name = models.CharField(max_length=255, blank=False, null=False)
mobile = models.CharField(validators=[mobile_regex], max_length=15)
email = models.EmailField(max_length=255, blank=False, null=False)
picture = models.ImageField(upload_to="images/", blank=True, null=True)
document = models.FileField(upload_to=get_upload_path, null=True, blank=True)

и вот мой serializers.py

class DoctorSerializer(serializers.ModelSerializer):
class Meta:
    model = Doctor
    fields = ['id','name','email','mobile' ,'document',]
    
def create(self, validated_data):
    return Doctor.objects.create(**validated_data)

и мой файл views.py...

class CreateDoctorAPIView(APIView):
parser_classes = (MultiPartParser, )
def post(self,request,*args):
    try:
        files = request.FILES['document']
        print(files)
        serializer = DoctorSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({
                'message': 'Doctor created successfully',
            })
        else:
            return Response({
                'message':'something wrong'
            })
    except Exception as e:
        return Response({
            'mesaage':str(e)
        })

Вы можете сделать это, создав отдельную таблицу только для изображений и создав между ними отношение ManyToMany


class DoctorImage(models.Model):
    def get_upload_path(instance, filename):
        return 'documents/{0}/{1}'.format(instance.name, filename)
    
    picture = models.ImageField(upload_to="images/", blank=True, null=True)


class Doctor(models.Model):

    mobile_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Up to 15 digits allowed.")
    name = models.CharField(max_length=255, blank=False, null=False)
    mobile = models.CharField(validators=[mobile_regex], max_length=15)
    email = models.EmailField(max_length=255, blank=False, null=False)
    doctor_images = models.ManyToManyField(DoctorImage)
    document = models.FileField(upload_to=get_upload_path, null=True, blank=True)

В вашем файле serializers.py

class DoctorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Doctor
        fields = ['id','name','email','mobile' ,'document',]
    
    def create(self, validated_data):
        # assuming you're sending images in a list
        images = validated_data.pop('images') # this is your key name that you'll send in request
        doctor = Doctor.objects.create(**validated_data)
        doctor.docter_images.add(*images) # pass images list at once
        return doctor
Вернуться на верх