0

我正在使用 Pyamf 作为我的 Flex 应用程序的后端,并且我看到了一些与强类型类的映射有关的奇怪问题。

这是我要返回的模型

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 中完成了 register_class 并在 Flex 中完成了 RemoteClass。所以这对我来说没有意义。我一定做错了什么?

在玩弄它时,我尝试了一些不同的东西。有点奏效的一件事是在 Flex 中迭代数组并将项目转换为 SouvenirAct 对象,如下所示:

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

当我在 Flex 中这样做时,我的 SouvenirAct 对象按应有的方式输入,但是子纪念品对象全部为空。因此,当我在返回结果中强制转换 SouvenirAct 对象时,对于强类型的子属性,我会得到 null。

有没有人见过这个?我应该以不同的方式映射类吗?

4

2 回答 2

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

于 2011-11-15T16:21:13.227 回答
0

好的,所以这是一种猜测,但这已经刺痛了我几次。Souvenir你有没有在你的弹性应用程序中实例化过任何地方的实例?如果不是... AS 没有费心去编译它,你会得到匿名对象。

当您执行 onResult 循环代码块时,它可以工作,因为您正在实例化 的对象SouvenirAct,但从不实例化Souvenir(子),所以它仍然为空,因为 ActionScript 从未编译过它...在您的服务调用之前尝试这个

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

现在,既然您已经创建了 SouvenirAct 的一个实例,它实际上应该被编译到您的应用程序中。这通常不是问题,因为我们假设您将在某个时候使用该类,然后您可以返回并删除imjustheretocompileandalsoCompileMetoo变量。

于 2011-11-15T15:48:58.007 回答