首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyamf register_class未按预期映射强类型对象

Pyamf register_class未按预期映射强类型对象
EN

Stack Overflow用户
提问于 2011-11-15 23:27:50
回答 2查看 298关注 0票数 0

我正在使用Pyamf作为我的Flex应用程序的后端,我发现在强类型类的映射方面有一些奇怪的问题。

这是我要返回的模型

代码语言:javascript
复制
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中的对象:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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对象,如下所示:

代码语言:javascript
复制
private function onResult(r:Array):void
{
    for each(var o:Object in r)
    {
        var c:SouvenirAct = o as SouvenirAct;
    }
}

当我在Flex中这样做的时候,我得到了我的SouvenirAct对象的类型,但是子纪念品对象都是空的。因此,当我在返回结果中强制转换SouvenirAct对象时,强类型的子属性会得到null。

以前有没有人见过这个?有没有一种不同的方式来映射类?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-16 00:21:13

所以我现在非常确定问题出在netConnection类上。我把它换掉了,这样我就可以使用RemoteObject了,现在一切都像预期的那样工作了。

这就是我是如何连接的:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2011-11-15 23:48:58

好吧,这只是一种猜测,但这已经刺痛了我几次。您是否曾经在flex应用程序中实例化过Souvenir anywhere实例?如果不是..。AS没有费心去编译它,你会得到匿名对象。

当您执行onResult循环代码块时,它之所以有效,是因为您正在实例化SouvenirAct的对象,但从未实例化Souvenir (子级),因此它仍然为null,因为ActionScript从未在您的服务调用之前编译it...Try

代码语言:javascript
复制
//TODO: remove me later
var imjustheretocompile:Souvenir = new Souvenir();
var alsoCompileMetoo:SouvenirAct = new SouvenirAct();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8138756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档