Reputation: 129
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
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
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