i have one model which having foreign key with images feild and in that i have multiple images can i get them in single list like this :
Question:
Models.py
class Cat_Breed_Detail(models.Model):
id = models.AutoField(primary_key=True,verbose_name="id")
key_name = models.CharField(max_length=35,default='',null=True,verbose_name="key_name")
display_name= models.CharField(max_length=35,default='',null=True,verbose_name="display_name")
def __str__(self):
return self.key_name
class Cat_Image(models.Model):
image=models.ImageField(upload_to="ImagesCat/")
cat=models.ForeignKey(Cat_Breed_Detail,on_delete=models.CASCADE,null=True,related_name='images')
def image_preview(self):
if self.image:
return mark_safe('<img src="{0}" width="150" height="150" />'.format(self.image.url))
else:
return '(No image)'
Selializer.py
class CatImageSerializer(serializers.ModelSerializer):
class Meta:
model = Cat_Image
fields = '__all__'
class CatDataSerializer(serializers.ModelSerializer):
class Meta:
model = Cat_Breed_Detail
fields = ['id','key_name','display_name','images']
View.py
class CatListCreate(ListAPIView):
queryset = CatBreedDetails.objects.all().order_by('key_name')
serializer_class = CatDataSerializer
pagination_class = CustomPagination
response i am getting here i am getting nested response i dont want it i just want image url in images as a list not like the response i am currently getting :
{
"id": 9,
"key_name": "abyssinian",
"display_name": "Abyssinian",
"image": [
{
"id": 3,
"image": "/media/Abyssinian_0006.jpg",
"cat": 9
},
{
"id": 4,
"image": "/media/Abyssinian_0092.jpg",
"cat": 9
}
]
},
{
"id": 18,
"key_name": "american_bobtail",
"display_name": "American Bobtail",
"image": [
{
"id": 5,
"image": "/media/American_Bobtail_0004.jpg",
"cat": 18
},
{
"id": 6,
"image": "/media/American_Bobtail_0057.png",
"cat": 18
}
]
},
{
"id": 19,
"key_name": "american_curl",
"display_name": "American Curl",
"image": [
{
"id": 7,
"image": "/media/American_Curl_0078.jpg",
"cat": 19
},
{
"id": 8,
"image": "/media/American_Curl_0083.png",
"cat": 19
}
]
}
i want to get all the images in one list not like image:{image:"…."
,image:"……"} i am new to djnago and still learning is there any way to make it done .
is there any way i can get response like that :
{
"id": 9,
"key_name": "abyssinian",
"display_name": "Abyssinian",
"image": ["/media/Abyssinian_0006.jpg","/media/Abyssinian_0092.jpg",]
}
Answers:
[
{
"id": 1,
"key_name": "first cat",
"display_name": "first cat",
"images": [
{
"image": "http://localhost:8000/ImagesCat/Screenshot_from_2022-12-21_18-16-28.png"
},
{
"image": "http://localhost:8000/ImagesCat/Screenshot_from_2022-12-29_13-41-31.png"
}
]
}
]
this is how I get response if you want to make like yours then you have to override list method
from rest_framework import serializers
from app.models import Cat_Image, Cat_Breed_Detail
class CatImageSerializer(serializers.ModelSerializer):
class Meta:
model = Cat_Image
fields = '__all__'
class CatImageSerializer2(serializers.ModelSerializer):
class Meta:
model = Cat_Image
fields = ['image']
class CatDataSerializer(serializers.ModelSerializer):
images = CatImageSerializer2(read_only=True, many=True)
class Meta:
model = Cat_Breed_Detail
fields = ['id', 'key_name', 'display_name', 'images']
i just override the serialize data like this :
for d in seri.data:
d.update({'images': [nest_d['image'] for nest_d in d['images']]})
Models.py
class Cat_Breed_Detail(models.Model):
id = models.AutoField(primary_key=True,verbose_name="id")
key_name = models.CharField(max_length=35,default='',null=True,verbose_name="key_name")
display_name= models.CharField(max_length=35,default='',null=True,verbose_name="display_name")
def __str__(self):
return self.key_name
class Cat_Image(models.Model):
image=models.ImageField(upload_to="ImagesCat/")
cat=models.ForeignKey(Cat_Breed_Detail,on_delete=models.CASCADE,null=True,related_name='images')
def image_preview(self):
if self.image:
return mark_safe('<img src="{0}" width="150" height="150" />'.format(self.image.url))
else:
return '(No image)'
Selializer.py
class CatImageSerializer(serializers.ModelSerializer):
class Meta:
model = Cat_Image
fields = '__all__'
class CatDataSerializer(serializers.ModelSerializer):
class Meta:
model = Cat_Breed_Detail
fields = ['id','key_name','display_name','images']
View.py
class CatListCreate(ListAPIView):
queryset = CatBreedDetails.objects.all().order_by('key_name')
serializer_class = CatDataSerializer
pagination_class = CustomPagination
response i am getting here i am getting nested response i dont want it i just want image url in images as a list not like the response i am currently getting :
{
"id": 9,
"key_name": "abyssinian",
"display_name": "Abyssinian",
"image": [
{
"id": 3,
"image": "/media/Abyssinian_0006.jpg",
"cat": 9
},
{
"id": 4,
"image": "/media/Abyssinian_0092.jpg",
"cat": 9
}
]
},
{
"id": 18,
"key_name": "american_bobtail",
"display_name": "American Bobtail",
"image": [
{
"id": 5,
"image": "/media/American_Bobtail_0004.jpg",
"cat": 18
},
{
"id": 6,
"image": "/media/American_Bobtail_0057.png",
"cat": 18
}
]
},
{
"id": 19,
"key_name": "american_curl",
"display_name": "American Curl",
"image": [
{
"id": 7,
"image": "/media/American_Curl_0078.jpg",
"cat": 19
},
{
"id": 8,
"image": "/media/American_Curl_0083.png",
"cat": 19
}
]
}
i want to get all the images in one list not like image:{image:"…."
,image:"……"} i am new to djnago and still learning is there any way to make it done .
is there any way i can get response like that :
{
"id": 9,
"key_name": "abyssinian",
"display_name": "Abyssinian",
"image": ["/media/Abyssinian_0006.jpg","/media/Abyssinian_0092.jpg",]
}
[
{
"id": 1,
"key_name": "first cat",
"display_name": "first cat",
"images": [
{
"image": "http://localhost:8000/ImagesCat/Screenshot_from_2022-12-21_18-16-28.png"
},
{
"image": "http://localhost:8000/ImagesCat/Screenshot_from_2022-12-29_13-41-31.png"
}
]
}
]
this is how I get response if you want to make like yours then you have to override list method
from rest_framework import serializers
from app.models import Cat_Image, Cat_Breed_Detail
class CatImageSerializer(serializers.ModelSerializer):
class Meta:
model = Cat_Image
fields = '__all__'
class CatImageSerializer2(serializers.ModelSerializer):
class Meta:
model = Cat_Image
fields = ['image']
class CatDataSerializer(serializers.ModelSerializer):
images = CatImageSerializer2(read_only=True, many=True)
class Meta:
model = Cat_Breed_Detail
fields = ['id', 'key_name', 'display_name', 'images']
i just override the serialize data like this :
for d in seri.data:
d.update({'images': [nest_d['image'] for nest_d in d['images']]})