1

例如,使用我的 UserProfile 模型:

class UserProfile(models.Model):
  user      = models.ForeignKey( User, unique=True )
  blurb     = models.CharField( max_length=200, null=True, blank=True )
  public    = models.BooleanField( default=True )
  ...

因此,我最终得到了一个名为“public”的字段。这在 ActionScript 中不适用,因为它是一个关键字。更改很烦人,因为它已融入 django-profile 包中的多层功能。所以,我不得不在 Flex 端重命名它:

[RemoteClass(alias="...")]
[Bindable]
public class UserProfile
{
    public function UserProfile()
    {
    }
    public var id:int;
    public var blurb:String;
    public var _public:Boolean;
    ...

在交易的任何一方,我可以在哪里声明“远程字段公共转换为本地字段_public”?我在 PyAMF 方面对 ClassAliases 进行了一些处理,但它很快就变得一团糟,并且没有关于如何很好地做到这一点的文档。Flex 方面的文档似乎表明我可以覆盖一个“处理传入请求”处理程序,但我认为它发生在已经填充 com 对象中的字段之后,因此将它们放在地板上,因为适当的字段不存在,给我留下了一堆:

ReferenceError: Error #1056: Cannot create property

在 Flex 跟踪中...

4

1 回答 1

1

为了支持这一点,PyAMF 需要提供字段之间的同义词映射。在那之前,您可以使用IExternalizable(虽然很笨拙):

class UserProfile(model.Model):
  user      = models.ForeignKey( User, unique=True )
  blurb     = models.CharField( max_length=200, null=True, blank=True )
  public    = models.BooleanField( default=True )

  class __amf__:
    external = True

  def __writeamf__(self, output):
    output.writeObject(self.id)
    output.writeObject(self.blurb)
    output.writeObject(self.public)

  def __readamf__(self, input):
    self.id = input.readObject()
    self.blurb = input.readObject()
    self.public = input.readObject()

使用相应的 Flex 代码:

[RemoteClass(alias="...")]
[Bindable]
public class UserProfile implements IExternalizable
{
  public function UserProfile()
  {
  }
  public var id:int;
  public var blurb:String;
  public var _public:Boolean;

  public function writeExternal(output:IDataOutput)
  {
    output.writeObject(id);
    output.writeObject(blurb);
    output.writeObject(_public);
  }

  public function readExternal(input:IDataInput)
  {
    id = input.readObject();
    blurb = input.readObject();
    _public = input.readObject();
  }
}

注意我没有测试上面的代码,但原则上应该可以工作。

顺便说一句,您能否更详细地了解文档中令人困惑的地方?我很乐意为新用户说明这一点。

于 2010-06-01T20:33:12.750 回答