Reputation: 10147
I have two models first one is
class Event(models.Model):
main_image = models.ImageField(upload_to='events/images', default="")
event_name = models.CharField(max_length=100, default="")
event_organizer = models.ForeignKey(
Organizer, on_delete=models.CASCADE, limit_choices_to={'is_active': True})
and other one is
class additional_images(models.Model):
# When a Event is deleted, upload models are also deleted
event = models.ForeignKey(Event, on_delete=models.CASCADE)
image = models.FileField(upload_to='events/images', null=True, blank=True, default="")
and serializer class is given by
class eventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = ['id', 'main_image', 'event_name', 'event_address', 'event_organizer']
my question is how i get additional_images
with eventSerializer
.
Upvotes: 1
Views: 2383
Reputation: 3392
class eventSerializer(serializers.ModelSerializer):
image = serializers.CharField(source='additional_images.get_image_url', read_only=True)
additional_images = serializers.PrimaryKeyRelatedField(queryset=additional_images.objects.all())
class Meta:
model = Event
fields = ['id','main_image', 'event_address', 'event_organizer', 'additional_images', 'image']
and define a get image url method in your models
class additional_images(models.Model):
.........
def get_image_url(self):
returen "%s,%s" %(settings.MEDIA_URL, self.image)
Upvotes: 0
Reputation: 10147
Thanks to Bear Brown. his comment was helpful and I post it as a answer
Update my additional_images
model
class additional_images(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE,
related_name="additional_images",
related_query_name="additional_image",)
image = models.FileField(upload_to='events/images', null=True, blank=True, default="")
And make serializer class for this
class additionalImagesSerializer(serializers.ModelSerializer):
class Meta:
model = additional_images
fields = ['image']
And in eventSerializer
class
class eventSerializer(serializers.ModelSerializer):
additional_images = additionalImagesSerializer(many=True, read_only=True)
class Meta:
model = Event
fields = ['additional_images', 'id', 'main_image', 'event_name',
'event_address', 'event_organizer']
That's work Perfectly!
Upvotes: 1
Reputation: 3091
You can read about ForeignKey
and how to access the relation between them in the documentation.
But, you can do something like this:
1) (Optional) specify related_name:
class additional_images(models.Model):
# When a Event is deleted, upload models are also deleted
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name="images")
2) You can now access it with event.images
. So you can use that in your serializer:
class eventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = ['id', 'main_image', 'event_name', 'event_address', 'event_organizer', 'images']
Now you will get images as a list of image ids. If you have a image serialier, you can specify a nested serializer in your event serializer.
Code review comment: You have 3 classes, and each of them has different naming convention. Stick to one, preferably -> EventSerializer
.
Upvotes: 0