2010-01-05 26 views
6

Tôi đang sử dụng piston và tôi muốn nhổ ra một định dạng tùy chỉnh cho phản hồi của tôi.Piston tùy chỉnh đại diện phản ứng

mô hình của tôi là một cái gì đó như thế này:

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

Bây giờ khi tôi đưa ra một yêu cầu GET đến một cái gì đó giống như/api/xe/1/Tôi muốn có được một câu trả lời như thế này:

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

Tuy nhiên, piston chỉ xuất ra kết quả này:

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

Nói cách khác, tôi muốn tùy chỉnh đại diện của một nguồn.

handler Resource piston của tôi hiện trông như thế này:

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

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

Vì vậy, tôi không thực sự có được nơi tôi có cơ hội để tùy chỉnh dữ liệu. Trừ khi tôi phải ghi đè lên bộ phát JSON, nhưng điều đó có vẻ giống như một đoạn.

Trả lời

6

Bạn có thể trở lại định dạng tùy chỉnh bằng cách quay một cuốn từ điển Python. Dưới đây là một ví dụ về một trong các ứng dụng của tôi. Tôi hy vọng nó sẽ giúp.

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} 
+0

Vì vậy, bạn CÓ THỂ trả lại một từ điển! Tuyệt vời, không biết điều đó. Cảm ơn! – drozzy

+0

Wow, đây là một bất ngờ thú vị! – jathanism

-2

Django đi kèm với thư viện tuần tự hóa. Bạn cũng sẽ cần một thư viện json để có được nó sang định dạng mà bạn muốn

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)) 
+0

Câu hỏi đặt ra là về làm thế nào để thêm các trường để phản đối JSON đại diện , không phải cách tạo JSON. –

1

Đã hai năm kể từ khi câu hỏi này được hỏi, vì vậy rõ ràng là muộn cho OP. Nhưng đối với những người khác, giống như tôi, đã có một tình trạng khó xử tương tự thì tồn tại một cách Pistonic để thực hiện việc này.

Sử dụng ví dụ Django của các cuộc thăm dò và lựa chọn -

Bạn sẽ nhận thấy rằng đối với ChoiceHandler phản ứng JSON là:

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

này bao gồm toàn bộ JSON cho bình chọn đi kèm trong khi chỉ id cho nó có thể tốt như thế nếu không tốt hơn.

Hãy nói rằng mong muốn phản ứng là:

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

Đây là cách bạn sẽ chỉnh sửa xử lý để đạt được điều đó:

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

Có tương đương với trường lồng nhau không? Có vẻ như piston chỉ hỗ trợ unnested, dựa trên emitters.py của nó – TankorSmash

Các vấn đề liên quan