2013-04-16 9 views
4

Я пишу приложение API для отдыха, основанное на базе отдыха Django. Я хочу вернуть мои данные модели в виде JSONDjango rest-framework

Мои модели:

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) 

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

Я написал класс в моем views.py как:

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) 

И мой URL.py является:

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'), 
) 

Но если я запрашивайте (http://localhost:8000/stores/) the following error is thrown:'list' object has no attribute 'status_code'

Пожалуйста, скажите мне, как сериализовать данные модели с помощью покоя базы в объекты JSON ....

ответ

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' 
       ) 

Я думаю, вы должны изменить метод storeImage для того, чтобы обеспечить путь изображения на сервере ...... или определить новый метод для этого ....

+1

Я попробую это .... Мне нужно создать новый serializer.py, а затем использовать ваш класс сериализатора, если я не ошибаюсь ...? – 2013-05-16 06:04:48

+0

да ... вы правы ... –

3

Вы должны вернуть Response, а не просто возвращая список.

ret = [i.storeName for i in stores.objects.all()] 
return Response(ret) 
Смежные вопросы