2011-11-15 4 views
0

私はFlexアプリケーションのバックエンドとしてPyamfを使用していますが、型付きの厳しいクラスのマッピングに関するいくつかの奇妙な問題があります。Pyamf register_classが厳密に型付けされたオブジェクトを期待通りにマッピングしていない

ここで私はここで

class MilestonActBase(RewardActBase): 

    def __unicode__(self): 
     return self.milestone.title 

    class Meta: 
     abstract = True 

class SouvenirAct(MilestonActBase): 
    souvenir = models.ForeignKey(Souvenir) 
    group = models.ForeignKey(Group, blank=True, null=True) 
    def __unicode__(self): 
     return self.souvenir.title 

を返すよモデルが私のviews.py内のオブジェクトを返す私の方法である:ここでは

try: 
    pyamf.register_class(Souvenir, 'com.rain.dennys.services.vo.Souvenir') 
    pyamf.register_class(SouvenirAct, 'com.rain.dennys.services.vo.SouvenirAct') 
except ValueError: 
    print "Classes already registered" 

@login_required 
def get_souvenir_acts(http_request): 
    user = http_request.user 
    souvenirActs = SouvenirAct.objects.filter(user=user) 
    return souvenirActs 

は私のAS3クラスです:

package com.rain.dennys.model 
{ 
    [RemoteClass (alias="com.rain.dennys.services.vo.SouvenirAct")] 
    [Bindable] 
    public class SouvenirAct extends RewardActBase 
    { 
     public var souvenir:Souvenir; 
     public function SouvenirAct() 
     { 
     } 
    } 
} 

私がサービスを呼び出すと、私はpythonとRでregister_classを行ったにしても、戻って匿名オブジェクトの配列を取得しますFlexのemoteClassだからそれは私にとって意味をなさない。私は何か間違っている必要がありますか?

私はいくつかのことを試してみました。ちょっと働いたことの一つは、Flexの配列に反復処理しSouvenirActがそうのようなオブジェクトなどの項目をキャストすることでした:

private function onResult(r:Array):void 
{ 
    for each(var o:Object in r) 
    { 
     var c:SouvenirAct = o as SouvenirAct; 
    } 
} 

私は、Flexで、私は彼らがあるべきように私SouvenirActオブジェクトが入力され得ることをんが、子供向けのおみやげ物はすべてnullです。だから私は返す結果でSouvenirActオブジェクトのキャストを強制的に、私は強く型付けされている子プロパティのnullを取得します。

誰もこれまでに見ましたか?クラスをマッピングする別の方法はありますか?

答えて

1

これで、問題はnetConnectionクラスの問題であることがわかりました。私はRemoteObjectを使うことができるようにそれを切り替えました。そして今はすべてが期待どおりに動作します。

これは私が接続された方法です。

netConnection.connect("http://127.0.0.1:8000/gateway/"); 
netConnection.addEventListener(NetStatusEvent.NET_STATUS, onError); 
var responder:Responder = new Responder(onResult, handleFault); 

をその後、私はここで説明されているものに切り替える:http://www.adobe.com/devnet/flex/articles/flex_django.html誰がこのに実行され、あなたがたNetConnectionを使用している場合は、私のアドバイスは、RemoteObjectの

に行くことです
0

これは一種の推測ですが、これは数回私を刺されました。フレックスアプリケーションの任意の場所にSouvenirのインスタンスをインスタンス化したことがありますか?そうでなければ... ASはそれをコンパイルするのに気にせず、匿名のオブジェクトを返すでしょう。

あなたがコードのあなたはonResultループブロックを行い、あなたがSouvenirActのオブジェクトをインスタンス化しますが、Souvenir(子)をインスタンス化することはありませんしているので、ActionScriptはそれをコンパイルしたことがないので、それはまだヌルですので、それは、働く...前にこれを試してみてくださいあなたがSouvenirActのインスタンスを作成しましたので、ご利用のサービスコール今

//TODO: remove me later 
var imjustheretocompile:Souvenir = new Souvenir(); 
var alsoCompileMetoo:SouvenirAct = new SouvenirAct(); 

は、それが実際にあなたのアプリケーションにコンパイルする必要があります。ある時点でそのクラスを使用していると思われるので、これは通常問題ではありません。次に、imjustheretocompilealsoCompileMetooの変数を削除して削除することができます。

+0

ジョナサンを助けてくれてありがとう!私は同じことを考えていた。しかし、私はそれがコンパイルされていることを確認しましたが、まだ作業ができません。 –

関連する問題