2009-05-13 6 views
2

J'utilise PyAmf pour communiquer avec une application Flex. Mais je continue à avoir des erreurs.PyAMF/Django - Erreurs de mappage de classe Flex

Mon modèle:

from django.contrib.auth.models import User 

class Talent(User): 
    street = models.CharField(max_length=100) 
    street_nr = models.CharField(max_length=100) 
    postal_code = models.PositiveIntegerField() 
    city = models.CharField(max_length=100) 
    description = models.CharField(max_length=100) 

Mon fichier passerelle:

from pyamf.remoting.gateway.django import DjangoGateway 
from addestino.bot.services import user 
from addestino.bot.models import * 
from django.contrib.auth.models import User 
import pyamf 

pyamf.register_class(User, 'django.contrib.auth.models.User') 
pyamf.register_class(Talent, 'addestino.bot.models.Talent') 

services = { 
    'user.register': user.register, 
    'user.login': user.login, 
    'user.logout': user.logout, 
} 

gateway = DjangoGateway(services, expose_request=True) 

Le Flex objet Talent:

package be.addestino.battleoftalents.model 
{ 
    [Bindable] 
    public class Investor 
    { 
    public static var ALIAS : String = 'be.addestino.battleoftalents.model.Investor'; 

    public var id:Object; 
    public var street:String; 
    public var street_nr:String; 
    public var postal_code:uint; 
    public var city:String; 
    public var cash:Number; 
    public var date_created:Date; 
    public var date_modified:Date; 
    public var username:String; 
    public var password:String; 
    public var email:String; 

    public function Investor() 
    { 
    }  
} 

}

Si Flex appelle mon register ServiceMethod (un méthode qui envoie un Flex Investor à python), j'obtiens une erreur 'KeyError: first_name'. Ensuite, quand nous ajoutons un champ first_name à notre Flex VO, nous obtenons une erreur last_name. Etc. Cette erreur signifie que notre VO flexible doit avoir exactement les mêmes champs que nos modèles django. Avec des objets simples, ce ne serait pas un problème. Mais nous utilisons des sous-classes de l'objet utilisateur django. Et cela signifie que notre investisseur a également besoin d'un champ user_ptr par exemple. Remarque: Toutes les erreurs se produisent avant la méthode de service.

Existe-t-il un moyen plus simple? Idéalement, nous aurions un Flex Investor VO avec seulement les champs que nous utilisons (qu'ils proviennent de l'utilisateur Django ou de notre django Investor qui s'étend de User). Mais maintenant les objets Flex devraient être modélisés EXACTEMENT après nos objets Django. Je ne sais même pas à quoi ressemble l'objet utilisateur Django (ce que je ne devrais pas faire).

Je pourrais vraiment utiliser de l'aide. Merci beaucoup à l'avance :-)

Répondre

3

Ceci est fait en utilisant l'interface IExternalizable.

Il vous permet d'écrire explicitement et lire des objets. Si cela est similaire à la sérialisation implicite de Java, cela ne vous laissera pas limiter ce qui est envoyé par défaut. Je n'ai pas pu trouver d'exemples avec PyAMF.

Best post sur Sérialisation J'ai trouvé.

1

Avec la sortie de PyAMF 0.6b2, je peux enfin répondre à cette question.

0.5.1 était assez strict dans la façon dont il gère l'héritage quand il s'agit d'encoder des modèles Django. Cela garantissait que toutes les propriétés étaient codées sur chaque objet et que toutes les propriétés étaient disponibles lors du décodage de la requête.

Ceci aspiré et le comportement a maintenant changé avec la sortie de la nouvelle version. PyAMF est beaucoup plus plus pardonner à propos de ce que vous lui remettez de Flex. Vous ne devriez plus avoir l'erreur KeyError (et si vous le faites, c'est considéré comme un bug).

Questions connexes