Вопрос

Например, используя мою модель пользователя:

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

Таким образом, у меня в конечном итоге поле под названием «публика». Это не Jive в ActionScript, потому что это ключевое слово. Это раздражает меняться, потому что он выпекается в несколько слоев функциональности в пакете Django-Profile. Итак, я вынужден переименовать его на гибкой стороне:

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

Где, по обе стороны от транзакции, могу ли я заявить: «Публичное общество переводится на локальное поле _public»? Я немного испортился с классами на стороне PYAMF, но это быстро стало грязным, и нет никакой документации о том, как это сделать хорошо. И документация на гибкой стороне, похоже, указывает на то, что есть обработчик «процесс входящего запроса», который я могу переопределить, но я думаю, что это происходит после того, как уже заполняет поля в объекте COM, что бросает их на пол, поскольку соответствует соответствующему Поля нет, и оставляет меня с кучей:

ReferenceError: Error #1056: Cannot create property

В гибкой следу ...

Это было полезно?

Решение

Чтобы поддержать это, 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()

С соответствующим гибким кодом:

[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();
  }
}

Обратите внимание, что я не проверил приведенный выше код, но должен работать в принципе.

Кстати, вы можете подробнее подробно о том, что сбивает с толку документация? Я хотел бы сделать это как можно более четким для новых пользователей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top