我正在使用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
servicemethod(一种将flex Investor发送到python的方法),则会收到错误'KeyError: first_name'
。然后,当我们向Flex VO添加first_name
字段时,我们会收到last_name
错误。等等。
此错误意味着我们的flex VO必须与我们的django模型具有完全相同的字段。使用简单的对象,这不是问题。但是我们使用django User对象的子类。这意味着我们的投资者也需要一个user_ptr
字段。
注意:我在服务方法之前得到了所有错误。
有更简单的方法吗?理想情况下,我们会有一个Flex Investor VO,只包含我们使用的字段(无论是来自Django用户还是来自Investor
的django User
)。但是现在我们的Django对象之后必须完全建模Flex对象。我甚至不知道Django User对象的确切含义(我不应该这样)。
我真的可以使用一些帮助。非常感谢提前: - )
答案 0 :(得分:3)
这是使用IExternalizable接口完成的。
它允许您显式写入和读取对象。如果这与Java隐式序列化类似,则不会限制默认发送的内容。我无法通过PyAMF找到任何这方面的例子。
关于序列化的Best post我发现了。
答案 1 :(得分:1)
随着PyAMF 0.6b2的发布,我终于可以回答这个问题。
0.5.1在编写Django模型时处理继承的方式非常严格。它确保所有属性都保证在每个对象上进行编码 - 并且期望在解码请求时所有属性都可用。
这很糟糕,随着新版本的发布,行为现在已经改变了。对于你从Flex手中提供的内容,PyAMF对很多更加宽容。您不应再出现KeyError
错误(如果您这样做,则会将其视为错误)。