2009-11-16 55 views
2

閱讀sqlalchemy文檔,我看到了序列化部分。
我想了解一下使用XML序列化匹配與休息web服務如JAX-RS車型SA
有一個Django的擴展,它處理的是一種可能性:django_roa
你知道那種事早已爲sqlalchemy開發或者如果可以做到這一點?
感謝sqlalchemy REST序列化

+0

一些研究,我寫了一個小程序後顯示我想要的東西: HTTP://到位桶.org/ee_lars/resttest代碼真的很醜陋...對於經典字段(Integer,Unicode,Boolean ..),序列化是可以的但我沒有找到處理外鍵和類似東西的方法。 我認爲可以「檢測」某個字段處於特定類型(來自他的Model的映射器),然後將相關模型的URI作爲鏈接放入序列化資源中。無論如何,我不知道如何做到這一點:任何可能性/想法?謝謝。 – 2010-08-04 08:24:39

回答

1

sqlalchemy.ext.serializer能支持查詢表達式和其他內部 SQLAlchemy的對象酸洗(與pickle模塊),它不處理模型對象。絕不會幫助您將模型對象序列化爲XML。可能像pyxser會對你有用。

+0

好的,我會檢查它,謝謝 – 2009-11-16 15:22:07

2

它是一個很長的路要走,直到完全遵守RFC2616,但對於一個原型,我做這樣的事情:

from sqlalchemy import create_engine, Table, Column, Integer, String, ForeignKey, UniqueConstraint 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import relation, backref, sessionmaker 
from sqlalchemy.sql.expression import desc 
import web 
import json 

DB_PATH = 'sqlite:////tmp/test.db' 

Base = declarative_base() 

class LocalClient(Base): 
    __tablename__ = 'local_clients' 
    __jsonexport__ = ['id', 'name', 'password'] 

    id = Column(Integer, primary_key=True) 
    name = Column(String, unique=True, nullable=False) 
    password = Column(String) 

    def __init__(self, name, password): 
     self.name = name 
     self.password = password 

    def __repr__(self): 
     return "<LocalClient('%s', '%s')>" % (self.name, self.password) 

urls = (
    '/a/LocalClient', 'LocalClientsController' 
) 

class Encoder(json.JSONEncoder): 
    '''This class contains the JSON serializer function for user defined types''' 
    def default(self, obj): 
     '''This function uses the __jsonexport__ list of relevant attributes to serialize the objects that inherits Base''' 
     if isinstance(obj, Base): 
      return dict(zip(obj.__jsonexport__, [getattr(obj, v) for v in obj.__jsonexport__])) 
     return json.JSONEncoder.default(self, obj) 

class LocalClientsController: 
    '''The generic RESTful Local Clients Controller''' 
    def GET(self): 
     '''Returns a JSON list of LocalClients''' 
     engine = create_engine(DB_PATH, echo=False) 
     Session = sessionmaker(bind=engine) 
     session = Session() 
     clis = session.query(LocalClient) 
     return json.dumps([c for c in clis], cls=Encoder)