3

I am writing an rest API app based on Django rest-framework. I want to return my model data in JSON form

My models are :

from os import path
from django.db import models
from django.contrib import admin
from django.core.files.storage import FileSystemStorage

#------------------------------------------------------------------------------ 

projectDirPath = path.dirname(path.dirname(__file__)) 
storeImageDir = FileSystemStorage(location=projectDirPath + '/couponRestApiApp/stores')


class tags(models.Model):
    """ This is the tag model """
    tag = models.CharField(max_length=15)               # Tag name
    tagDescription = models.TextField()                 # Tag Description
    tagSlug = models.CharField(max_length=400)          # Extra info can be added to the existing tag using this field
    createdAt = models.DateTimeField(auto_now_add=True) # Time at which tag is created
    updatedAt = models.DateTimeField(auto_now=True)     # Time at which tag is updated
    
    def __unicode__(self):
        """Method to display string correctly"""
        return unicode(self.tag)
    class Meta:
        """Meta class to control display Behavior of the Model name """
        verbose_name_plural = "Tags"


class stores(models.Model):
    """ This is the store model """
    storeName = models.CharField(max_length=15)                                          # Store Name
    storeDescription = models.TextField()                                                # Store Description
    storeURL = models.URLField()                                                         # Store URL
    storePopularityNumber = models.IntegerField(max_length=1)                            # Store Popularity Number  
    storeImage = models.ImageField(upload_to="images")                                   # Store Image 
    storeSlug = models.CharField(max_length=400)                                         # This is the text you see in the URL
    createdAt = models.DateTimeField(auto_now_add=True)                                  # Time at which store is created
    updatedAt = models.DateTimeField(auto_now=True)                                      # Time at which store is updated
    storeTags = models.ManyToManyField(tags)                                             # All the tags associated with the store
    
    def __unicode__(self):
        """Method to display string correctly"""
        return unicode(self.storeName)
    def StoreTags(self):
        return '\n'.join([s.tag for s in self.storeTags.all()])
    def StoreImage(self):    
        return '<img src="/media/couponRestApiApp/stores/%s" height="150"/>' % (self.storeImage)
    StoreImage.allow_tags = True
    class Meta:
        """Meta class to control display Behavior of the Model name """
        verbose_name_plural = "Stores"

    
class coupons(models.Model):
    """ This is the coupon model """
    couponValue = models.CharField(max_length=4)                              # Coupon value in RS.
    couponDescription = models.TextField()                                    # Coupon Description
    couponURL = models.URLField()                                             # Coupon click URL
    couponStore = models.ForeignKey(stores)                                   # Key of coupon to store
    tagName = models.ForeignKey(tags,on_delete=models.PROTECT)                # Tag names associated to coupon
    success = models.TextField()                                              # Count of the number of times people have made it work
    failures =  models.TextField()                                            # Count of the number of times this has failed
    lastTested = models.DateTimeField(auto_now=True)                          # When was the coupon last tested
    createdAt = models.DateTimeField(auto_now_add=True)
    updatedAt = models.DateTimeField(auto_now=True)
    class Meta:
        """Meta class to control display Behavior of the Model name """
        verbose_name_plural = "Coupons"


class app(models.Model):
    """ This is the application model which is using the API """
    appName = models.CharField(max_length=20)                       # Application name
    appDomain = models.CharField(max_length=20)                     # Application description
    appKey =  models.TextField()                                    # Application Key 
    createdAt = models.DateTimeField(auto_now_add=True)             # Time at which Application is added is created
    updatedAt = models.DateTimeField(auto_now=True)                 # Time at which Application details are updated
    class Meta:
        """Meta class to control display Behavior of the Model name """
        verbose_name_plural = "Apps"



class subscriptions(models.Model):    
    """ These are the emails that are subscribing """  
    app =  models.CharField(max_length=20)                                # The application where the email came from
    store = models.CharField(max_length=20)                               # The optional store on which the email wants an update
    tag =   models.CharField(max_length=20)                               # The optional tag on which the email wants an update
    emailID = models.EmailField()                                         # EmailID of the registered user
    active =  models.BooleanField(default=True)                           # They may have unsubscribed
    createdAt = models.DateTimeField(auto_now_add=True)                   # Time at user subscribed to the alerts
    updatedAt = models.DateTimeField(auto_now=True)                       # Time at which user updated its subscription 
    class Meta:
        """Meta class to control display Behavior of the Model name """
        verbose_name_plural = "Subscriptions"     


class tagsAdmin(admin.ModelAdmin):
    list_display = ('tag', 'tagDescription', 'tagSlug')


class storesAdmin(admin.ModelAdmin):
    list_display = ('storeName','storeDescription','storeURL',
                    'storePopularityNumber','StoreImage',
                    'storeSlug','createdAt','createdAt','StoreTags'
                    )

class couponsAdmin(admin.ModelAdmin):
    list_display = ('couponValue','couponDescription','couponValue',
                    'couponURL', 'couponStore','tagName','success',
                    'failures','createdAt','updatedAt'
                    )
    
class appsAdmin(admin.ModelAdmin):
    list_display = ('appName','appDomain','appKey',
                    'createdAt','updatedAt'                    
                    )
    

class subcriptionsAdmin(admin.ModelAdmin):
    list_display = ('app','store','tag','emailID',
                    'active','createdAt','updatedAt'
                    )

admin.site.register(tags,tagsAdmin)
admin.site.register(stores,storesAdmin)
admin.site.register(coupons,couponsAdmin)
admin.site.register(app,appsAdmin)
admin.site.register(subscriptions,subcriptionsAdmin)

#------------------------------------------------------------------------------ 

I have written a class in my views.py as:

from rest_framework import status
from rest_framework.views import View
from rest_framework.response import Response
from couponRestApiApp.models import app,coupons,stores,subscriptions,tags

------------------------------------------------------------------------------

class getAllStores(View):
    """
    Provides access to all orders within the system.
    """
 
 
    def get(self, request):
        """
        Return a list of all orders.
        """ 
        storeResponse = [i.storeName for i in stores.objects.all()]
        print storeResponse
        return (storeResponse)

And my URL.py is :

from django.contrib import admin
from couponRestApiApp.views import getAllStores
from django.conf.urls import patterns, include, url
#------------------------------------------------------------------------------

admin.autodiscover()

urlpatterns = patterns('',

    url(r'^admin/', include(admin.site.urls)),
    url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
         {'document_root': "/home/vaibhav/TRAC/coupon-rest-api/couponRestApi/", 'show_indexes': False}),
    url(r'^stores/$',getAllStores.as_view(), name='getAllStores'),
)

But if i make request(http://localhost:8000/stores/) the following error is thrown:'list' object has no attribute 'status_code'

Please tell me how to serialize the model data using rest-framework into JSON objects....

2 Answers 2

4
class getAllStores(generics.ListAPIView,APIView):
    """
    Provides access to all orders within the system.
    """

    model = stores # Model name
    serializer_class = getAllStoresDetailSerializer # Call serializer

    def get_queryset(self):    
        return stores.objects.filter()

Serializer:

class getAllStoresDetailSerializer(serializers.ModelSerializer):

    storeTags = serializers.Field(source='StoreTags')
    storeImage = serializers.Field(source='storeImage')

    class Meta:
        model = stores
        fields = ('storeName','storeDescription',
                  'storeURL','storePopularityNumber','storeImage','storeTags',
                    'storeSlug','createdAt','updatedAt','StoreCoupons'
                 )

I think you have to modify the storeImage method in order to provide the path of the image on the server......or define new method for this ....

Sign up to request clarification or add additional context in comments.

1 Comment

I will try this out....i have to create new serializer.py and then use your serializer class if i am not wrong...?
3

You need to return a Response, rather than just returning a list.

ret = [i.storeName for i in stores.objects.all()]
return Response(ret)

Comments