chetan
chetan

Reputation: 129

How to return image file in Django model (rest framework)?

Models.py File My models are

class Club(models.Model):
    club_name = models.CharField(max_length=256, blank=True, null=True)
    *some other flieds*

class ClubRequirment(models.Model):
    *some other flieds*

class ClubImage(models.Model):
    image = models.ImageField(upload_to='club_image/picture/', blank=True, null=True)
    club = models.ForeignKey(Club, null=True, on_delete=models.CASCADE, related_name='club_image')
    created_on = models.DateTimeField(auto_now_add=True)
    update_on = models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.image)

Serializer.py File Serializers are:

class ClubImageSerializer(serializers.ModelSerializer):

    class Meta:
        model = ClubImage
        fields = "__all__"

class ClubRequirmentSerializer(serializers.ModelSerializer):

    class Meta:
       model = ClubRequirment
       fields = "__all__"

class ClubSerializer(serializers.ModelSerializer):
    club_requirment = serializers.SlugRelatedField(many=True,read_only=True,slug_field='text')
    club_image = serializers.StringRelatedField(many=True)

    class Meta:
        model = Club
        fields = ('id', 'club_name', 'club_image', 'club_requirment')

Output of ClubSerializer

   [
    {
        "id": 1,
        "club_name": "Test Club",
        "club_image": [
            "club_image/picture/pexels-photo-247932_2gnEgrn.jpeg",
            "club_image/picture/FB_IMG_1525249792281.jpg"
        ],
        "club_requirment": [
            "Hello Günter",
            "whats your name",
            "text"
        ]
    }
]the 

above output only show image name I need to full path of image . if it possible to return in model or any solution

Upvotes: 0

Views: 1883

Answers (2)

Muhammad Hassan
Muhammad Hassan

Reputation: 14391

You have set club_image as StringRelatedField therefore it is treated as string. You should use ModelSerializer that you have written for image.

class ClubSerializer(serializers.ModelSerializer):
    club_requirment = serializers.SlugRelatedField(many=True,read_only=True,slug_field='text')
    club_image = ClubImageSerializer(many=True)

    class Meta:
        model = Club
        fields = ('id', 'club_name', 'club_image', 'club_requirment')

In case you want all images in same array:

class ClubSerializer(serializers.ModelSerializer):
    club_requirment = serializers.SlugRelatedField(many=True,read_only=True,slug_field='text')
    club_image = ClubImageSerializer(many=True)

    class Meta:
        model = Club
        fields = ('id', 'club_name', 'club_image', 'club_requirment')

    def to_representation(self, instance):
        data = super().to_representation(instance)
        club_image = data.pop('club_image')
        club_image_array = [a.get('image') for a in club_image]
        data.update({'club_image': club_image_array})
        return data

Upvotes: 1

Ashok
Ashok

Reputation: 1026

You can override get_club_image method by using SerializerMethodField() as specified in docs to get this done.

views.py:

def club_view(request):
    obj = ClubImage.objects.all()
    club_serializer = ClubImageSerializer(obj, context={"request": request})
    ....

and then in your serializers.py

serializers.py:

class ClubImageSerializer(serializers.ModelSerializer):

    club_image = serializers.SerializerMethodField()

    class Meta:
      model = ClubImage
      fields = ("id","club","club_image")

    def get_club_image(self, obj):
      request = self.context.get('request')
      club_image = obj.image.url
      return request.build_absolute_uri(club_image)

Upvotes: 1

Related Questions