2010-06-01 26 views
1

Par exemple, en utilisant mon modèle UserProfile:Comment puis-je mapper les noms de champs entre Django/PyAMF et Flex?

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

Ainsi, je me retrouve avec un champ appelé "public". Ce n'est pas le cas dans ActionScript car c'est un mot-clé. C'est ennuyeux à changer car il est cuit dans plusieurs couches de fonctionnalités dans le paquetage django-profile. Donc, je suis obligé de le renommer sur le côté Flex:

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

Où, de chaque côté de la transaction, puis-je dire « public sur le terrain à distance se traduit sur le terrain _PUBLIC local »? J'ai joué un peu avec ClassAliases sur le côté PyAMF, mais il est devenu rapidement désordonné et il n'y a pas de documentation sur la façon de le faire correctement. Et la documentation sur le côté Flex semble indiquer qu'il y a un gestionnaire "traiter la demande entrante" que je peux remplacer, mais je pense qu'il se produit après avoir déjà rempli les champs dans l'objet com, les laissant ainsi tomber sur le sol, puisque le champ n'est pas là, et me laissant avec un tas de:

ReferenceError: Error #1056: Cannot create property 

dans la trace Flex ...

Répondre

1

afin de soutenir cela, PyAMF doit fournir une cartographie des synonymes entre les champs. Jusque-là, vous pouvez utiliser IExternalizable (bien que gauchement):

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

Avec le code Flex correspondant:

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

Remarque Je n'ai pas testé le code ci-dessus, mais devrait fonctionner en principe.

Btw, pouvez-vous aller plus en détail sur ce qui était confus au sujet de la documentation? J'aimerais rendre cela aussi clair que possible pour les nouveaux utilisateurs.

+0

génial, merci beaucoup, je suis sûr que cela devrait fonctionner, je vais l'essayer sous peu. Pour être juste, j'ai vu quelque chose à cet effet écrit quelque part, j'espérais juste qu'il y aurait quelque chose de plus explicite qui écrirait cela pour moi, de sorte que je n'aurais pas à continuer à le faire à l'avenir. Cependant, je suppose que je pourrais écrire l'emballage pour cela et l'afficher pour les autres à utiliser. :-) Pour répondre à votre demande, je dirais que donner ce que vous avez écrit ci-dessus comme un exemple dans le lien de la documentation que vous avez pointé aurait aidé - j'ai dû creuser ailleurs pour obtenir quelque chose de similaire. – eruciform

+0

aussi, ce qui précède a la saveur d'être un peu un hack, ou en contournant le capot, pour moi. ça ne me donne pas confiance que ça ne va pas casser quelque chose ailleurs. alors qu'une api spécifique qui cartographie un champ à un autre le ferait. cependant, c'est juste le sentiment que je ressens de taper autant de __ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ __ (se sent comme tcp d'emballage à la main ou quelque chose :-) ce serait bien aussi s'il y avait plus d'une explication de l'interface classalias. Je ne suis pas vraiment sûr de ce qu'il fait, après avoir lu la documentation, ou comment l'utiliser. – eruciform

+0

ClassAlias ​​est censé être une classe interne à PyAMF utilisée pour traiter les métadonnées fournies par [classe] .__ amf__. La réponse ci-dessus est en effet un hack et j'ai créé un ticket pour fournir le service de synonymes décrit. Voir http://dev.pyamf.org/ticket/779 – njoyce