Search code examples
djangoapidjango-modelsdjango-rest-frameworkget

Django GET API for image field from different model


I am trying to get the image url from some model. I have made 2 models: Restaurant model:

class Restaurant(models.Model):
    from location.models import Area
    from business.models import Business

    name = models.CharField(verbose_name=_('Name'), max_length=255, unique=True)
    address = models.CharField(verbose_name=_("Address"), max_length=255)
    phone = models.CharField(verbose_name=_('Phone Number'), max_length=255)
    email = models.EmailField(verbose_name=_('Email'), max_length=255, blank=True, null=True)
    website = models.URLField(verbose_name=_('Website / Online Listing Link'), max_length=255, blank=True, null=True)
    is_active = models.BooleanField(verbose_name=_("Is Active?"), default=True)
    is_veg = models.BooleanField(verbose_name=_('Is Veg?'), default=True)

class Meta:
    verbose_name = 'Restaurant'
    verbose_name_plural = 'Restaurants'

And Restaurant Image model:

class RestaurantImage(models.Model):
    image_type = models.CharField(verbose_name=_('Image Type'), choices=IMAGE_TYPES, max_length=255, default=RESTAURANT)
    restaurant = models.ForeignKey(verbose_name=_('Restaurant'), on_delete=models.PROTECT, to=Restaurant)
    image = models.ImageField(verbose_name=_('Select Image'), upload_to='media/')

    def __str__(self):
        return self.restaurant.name + " - " + IMAGE_TYPES_DICT[self.image_type]

    class Meta:
        verbose_name = 'Restaurant Image'
        verbose_name_plural = 'Restaurant Images'

I need to get the image of the restaurant, so I tried to get the image by property method but got UnicodeDecodeError.

@property
def images(self):
    images = []
    for i in RestaurantImage.objects.filter(restaurant=self.id):
        images.append(i.image)

    return images

Please help me in getting the image url. Thank you.


Solution

  • So, I found a solution. It works as of now, but still, I would like to explore a better way of fetching an image.

    @property
    def images(self):
        import sys
        images = []
    
        for i in RestaurantImage.objects.filter(restaurant=self.id):
            file = 'http://' + sys.argv[-1] + '/'
            image_path = i.image.file.name
            file += image_path[image_path.find('images/'):]
            images.append(file)
    
        return images
    

    I basically generated the path of the image.