Как я могу сопоставить имена полей между Django / PyAMF и Flex? - PullRequest
1 голос
/ 01 июня 2010

Например, используя мою модель 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 переводится в локальное поле _public»? Я немного повозился с ClassAliases на стороне PyAMF, но он быстро запутался, и нет документации о том, как это сделать. И документация на стороне Flex, похоже, указывает на то, что есть обработчик «обработать входящий запрос», который я могу переопределить, но я думаю, что это происходит после того, как поля объекта com уже заполнены, и, следовательно, они сбрасываются на пол, так как соответствующие поля там нет, а мне осталось куча:

ReferenceError: Error #1056: Cannot create property

в следе Flex ...

1 Ответ

1 голос
/ 02 июня 2010

Для поддержки этого 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();
  }
}

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

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

...