PyAMF / Django - Flex类映射错误
我正在使用PyAmf来和一个Flex应用进行通信,但我总是遇到错误。
我的模型:
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)
我的网关文件:
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)
Flex的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()
{
}
}
}
当Flex调用我的register
服务方法(这个方法是把Flex中的投资者信息发送到Python)时,我遇到了一个错误'KeyError: first_name'
。然后,当我们在Flex的VO(值对象)中添加一个first_name
字段时,又出现了last_name
的错误。依此类推。
这个错误的意思是,我们的Flex VO必须和我们的Django模型有完全相同的字段。对于简单的对象来说,这没什么问题。但我们使用的是Django的User对象的子类。这就意味着我们的投资者对象也需要一个user_ptr
字段,比如说。
注意:我在调用服务方法之前就遇到了所有的错误。
有没有更简单的方法呢?理想情况下,我们希望有一个只包含我们需要字段的Flex投资者VO(这些字段可能来自Django的User或者我们的DjangoInvestor
,它是从User
扩展而来的)。但现在Flex对象必须完全按照我们的Django对象来建模。我甚至不知道Django的User对象到底长什么样(其实我不应该知道)。
我真的需要一些帮助。非常感谢!:-)
2 个回答
1
随着PyAMF 0.6b2的发布,我终于可以回答这个问题了。
在0.5.1版本中,处理继承时对于编码Django模型的要求非常严格。它确保每个对象的所有属性都必须被编码,并且在解码请求时,所有属性都必须可用。
这让人很不爽,而在新版本发布后,这种行为已经改变。PyAMF现在对从Flex传递过来的内容要宽容得多。你应该不会再遇到KeyError
错误了(如果遇到,那就算是个bug)。