Поршень настроить представление ответа - PullRequest
6 голосов
/ 05 января 2010

Я использую поршень, и я хотел бы выложить пользовательский формат для моего ответа.

Моя модель примерно такая:

class Car(db.Model):
   name = models.CharField(max_length=256)
   color = models.CharField(max_length=256)

Теперь, когда я отправляю запрос GET на что-то вроде / api / cars / 1 /, я хочу получить ответ, подобный этому:

{'name' : 'BMW', 'color' : 'Blue',
  'link' : {'self' : '/api/cars/1'}
}

Однако поршень выводит только это:

{'name' : 'BMW', 'color' : 'Blue'}

Другими словами, я хочу настроить представление определенного ресурса.

Мой обработчик ресурсов поршня в настоящее время выглядит так:

class CarHandler(AnonymousBaseHandler):
    allowed_methods = ('GET',)
    model = Car
    fields = ('name', 'color',)

    def read(self, request, car_id):
           return Car.get(pk=car_id)

Так что я действительно не понимаю, где у меня есть возможность настроить данные. Если только мне не нужно перезаписывать эмиттер JSON, но это кажется натяжкой.

Ответы [ 3 ]

6 голосов
/ 05 января 2010

Вы можете вернуть пользовательский формат, вернув словарь Python. Вот пример одного из моих приложений. Надеюсь, это поможет.

from models import *
from piston.handler import BaseHandler
from django.http import Http404

class ZipCodeHandler(BaseHandler):
    methods_allowed = ('GET',)

    def read(self, request, zip_code):
        try:
            points = DeliveryPoint.objects.filter(zip_code=zip_code).order_by("name")
            dps = []
            for p in points:
                name = p.name if (len(p.name)<=16) else p.name[:16]+"..."
                dps.append({'name': name, 'zone': p.zone, 'price': p.price})
            return {'length':len(dps), 'dps':dps}    
        except Exception, e:
            return {'length':0, "error":e}
1 голос
/ 23 февраля 2012

Прошло два года с тех пор, как был задан этот вопрос, так что, очевидно, уже поздно для ОП. Но для других, у которых, как и у меня, была подобная дилемма, существует Pistonic способ сделать это.

Использование примера опросов и выборов в Django -

Вы заметите, что для ChoiceHandler ответ JSON:

[
    {
        "votes": 0,
        "poll": {
            "pub_date": "2011-04-23",
            "question": "Do you like Icecream?",
            "polling_ended": false
        },
        "choice": "A lot!"
    }
]

Это включает в себя весь JSON для соответствующего опроса, тогда как только id для него могло бы быть так же хорошо, если не лучше.

Допустим, что желаемый ответ:

[
    {
        "id": 2,
        "votes": 0,
        "poll": 5,
        "choice": "A lot!"
    }
]

Вот как вы бы отредактировали обработчик для достижения этого:

from piston.handler import BaseHandler
from polls.models import Poll, Choice

class ChoiceHandler( BaseHandler ):
  allowed_methods = ('GET',)
  model = Choice
  # edit the values in fields to change what is in the response JSON
  fields = ('id', 'votes', 'poll', 'choice') # Add id to response fields
  # if you do not add 'id' here, the desired response will not contain it 
  # even if you have defined the classmethod 'id' below

  # customize the response JSON for the poll field to be the id 
  # instead of the complete JSON for the poll object
  @classmethod
  def poll(cls, model):
    if model.poll:
      return model.poll.id
    else:
      return None

  # define what id is in the response
  # this is just for descriptive purposes, 
  # Piston has built-in id support which is used when you add it to 'fields'
  @classmethod
  def id(cls, model):
    return model.id

  def read( self, request, id=None ):
    if id:
      try:
        return Choice.objects.get(id=id)
      except Choice.DoesNotExist, e:
        return {}
    else:
      return Choice.objects.all()
0 голосов
/ 05 января 2010

Django поставляется с библиотекой сериализации. Вам также понадобится библиотека json, чтобы получить ее в нужном формате

http://docs.djangoproject.com/en/dev/topics/serialization/

from django.core import serializers
import simplejson

class CarHandler(AnonymousBaseHandler):
    allowed_methods = ('GET',)
    model = Car
    fields = ('name', 'color',)

    def read(self, request, car_id):
           return simplejson.dumps( serializers.serialize("json", Car.get(pk=car_id) )
...