代码之家  ›  专栏  ›  技术社区  ›  eruciform

如何在django/pyamf和flex之间映射字段名?

  •  1
  • eruciform  · 技术社区  · 15 年前

    例如,使用我的用户配置文件模型:

    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 )
      ...
    

    因此,我最终得到了一个叫做“公共”的领域。这并不是因为ActionScript是一个关键字而加入它。更改是很烦人的,因为它在Django配置文件包中被烘焙成了多个功能层。所以,我不得不在flex端重新命名它:

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

    在事务的任一侧,我可以在哪里声明“远程字段公共转换为本地字段公共”?我在Pyamf方面处理了一些类别名,但是它很快就变得混乱了,并且没有关于如何很好地完成这一任务的文档。flex端的文档似乎表明有一个“处理传入请求”处理程序可以重写,但我认为它发生在已经填充了com对象中的字段之后,因此将它们放到了地板上,因为没有合适的字段,而留给我的是一堆:

    ReferenceError: Error #1056: Cannot create property
    

    在flex跟踪中…

    1 回复  |  直到 15 年前
        1
  •  1
  •   njoyce    15 年前

    为了支持这一点,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();
      }
    }
    

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

    顺便问一下,你能更详细地讲一下 documentation ?我希望对新用户尽可能清楚地说明这一点。