Sasikanth Kavuri
Sasikanth Kavuri

Reputation: 31

Django Rest Framework imageField to server

Currently I am trying to use an imageField to pass images from my model to an endpoint, but I don't know how to go about it.

Here is my model:

class searchResultsItem(models.Model):
    """
    Model to store search results item for a tableView cell
    """
    title = models.CharField(max_length = 100)
    price = models.CharField(max_length = 4)
    pop = models.IntegerField(default = 0)
    distance = models.CharField(max_length = 10)
    image = models.ImageField(upload_to="/media",default="/media")

Here is my view:

class searchResultsItemViewSet(viewsets.ModelViewSet):
    """
    API or Endpoint that can be viewed or edited
    """
    queryset = searchResultsItem.objects.all()
    serializer_class = searchResultsItemsSerializer

Here is my serializer:

class searchResultsItemsSerializer(serializers.ModelSerializer):
    """
    Serializer to parse searchResultsCell data
    """
    image = serializers.ImageField(
            max_length = None, use_url=True
        )

    class Meta:
        model = searchResultsItem
        fields = ('title','price','pop','distance','image')

Here is my urls:

from panView.searchTableData import views

router = routers.DefaultRouter()
router.register(r'searchResultsItem',views.searchResultsItemViewSet)

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

However, when I look at my endpoint I get a 404 error for the url of the image. The images are located in a media directory above my app folder and in my project folder. The text objects work just not the images.

If anyone knows how to pass images from the Django rest framework to an endpoint using imageField I'd like guidance for that.

Upvotes: 3

Views: 4949

Answers (1)

Saurabh Goyal
Saurabh Goyal

Reputation: 647

serializer.ImageField

This returns absolute url of the image, what we need is the relative url. You can do following for that-

class searchResultsItemsSerializer(serializers.ModelSerializer):
    """
    Serializer to parse searchResultsCell data
    """
    image = serializers.SerializerMethodField()

    def get_image(self, instance):
        # returning image url if there is an image else blank string
        return instance.image.url if instance.image else ''

    class Meta:
        model = searchResultsItem
        fields = ('title','price','pop','distance','image')

Docs for SerializerMethodField

Hope this helps.

Upvotes: 1

Related Questions