【问题标题】:How can I map field names between Django/PyAMF and Flex?如何在 Django/PyAMF 和 Flex 之间映射字段名称?
【发布时间】:2010-06-01 16:24:44
【问题描述】:

例如,使用我的 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 跟踪中...

【问题讨论】:

    标签: django apache-flex overriding field pyamf


    【解决方案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();
      }
    }
    

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

    顺便说一句,您能否详细说明documentation 的困惑之处?我很乐意为新用户说明这一点。

    【讨论】:

    • 太棒了,非常感谢,我相信这应该可行,我会尽快尝试。公平地说,我确实在某个地方看到过类似的东西,我只是希望有更明确的东西可以为我写这个,这样我以后就不必继续这样做了。但是,我想我可以为此编写包装器并将其发布以供其他人使用。 :-) 为了回答您的要求,我想说的是,在您指向的文档链接中以您在上面写的内容作为示例会有所帮助 - 我不得不在其他地方挖掘以获得与上述类似的东西。
    • 另外,对我来说,上面的内容有点像 hack,或者在引擎盖下偷偷摸摸。它不会让我相信它不会破坏其他地方的东西。而将一个字段映射到另一个字段的特定api会。但是,这只是我从输入这么多包含硬编码排序信息的 __ 双下划线 __ 中得到的感觉。 (感觉就像手动打包 tcp 或其他东西 :-) 如果对 classalias 接口有更多解释,那也很好。在阅读了文档或如何使用它之后,我不确定它的作用。
    • ClassAlias 是 PyAMF 的内部类,用于处理 [class].__amf__ 提供的元数据。上面的答案确实是一个 hack,我创建了一个提供所描述的同义词工具的票。见dev.pyamf.org/ticket/779
    • 非常好,谢谢!我很高兴看到有人借此机会将解决方案重新应用到产品中!
    猜你喜欢
    • 1970-01-01
    • 2021-04-30
    • 2012-04-02
    • 2015-01-24
    • 1970-01-01
    • 2019-11-04
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多