Search code examples
pythondjangodjango-modelsdjango-rest-frameworkphoto

How to upload photos to a file in my computer using Django rest framework


I created a photo model, serializer and view, Users Can upload photos to my website. I learned that the best solution to do it is to upload the photo on the computer and the path on data base. But how Can i upload the photo to my computer via my website or my api ?

Modèles.py

ken authentification. So for adding an Announcement the user must be authenticated.

Models.py

class User(AbstractUser):
    username = None
    email = models.EmailField(max_length=100, verbose_name='email', 
              unique=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    objects = UserManager()

class Announcement(models.Model):
     author = models.ForeignKey(User, on_delete=models.CASCADE)
     name = models.CharField(max_length=100)
     photo = models.ManyToManyField(Photo, blank=True)

class Photo(models.Model):
     name = models.CharField(max_length=100)
     content_type = models.CharField(max_length=100)
     path = models.CharField(max_length=100)

Serializers.py


class AnnouncementSerializer(serializers.ModelSerializer):
    author = UserSerializer(required=True)
    parameters = ParameterSerializer(many=True, 
       required=False)
    photo = PhotoSerializer(many=True, 
        required=False)
    class Meta:
        model = Announcement
        fields = ['id', 'name', 'author', 
                         'parameters', 'photo']

class UserSerializer(serializers.ModelSerializer):
    photo = PhotoSerializer()
    class Meta:
        model = User
        fields = ['id', 'email','photo', ]

class ParameterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Parameter
        fields = '__all__'
class PhotoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Photo
        fields = '__all__'

Views.py

class AnnouncementCreate(CreateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = models.Announcement.objects.all()
    serializer_class = AnnouncementSerializer

Solution

  • You should use ImageField in your model. Then when you upload image to your url, django saves it in a dir which you should set in MEDIA_ROOT section in settings.py:

    First install pillow for using ImageField:

    pip3 install pillow
    

    After that, add this field as photo to your model:

    ...
    photo = models.ImageField(...)
    ...
    

    This can be helpful : Django REST Framework image upload