Sohail Ahmad
Sohail Ahmad

Reputation: 10147

How Get data with join django Rest framework from other table

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

Answers (3)

bmons
bmons

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

Sohail Ahmad
Sohail Ahmad

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

Enthusiast Martin
Enthusiast Martin

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

Related Questions