Pyamf register_class не отображает строго типизированные объекты, как ожидалось - PullRequest
0 голосов
/ 15 ноября 2011

Я использую Pyamf в качестве бэкэнда для своего приложения Flex и вижу некоторые странные проблемы с отображением строго типизированных классов.

Вот модель, которую я возвращаю

class MilestonActBase(RewardActBase):

    def __unicode__(self):
        return self.milestone.title

    class Meta:
        abstract = True

class SouvenirAct(MilestonActBase):
    souvenir = models.ForeignKey(Souvenir)
    group = models.ForeignKey(Group, blank=True, null=True)
    def __unicode__(self):
        return self.souvenir.title

Вот мой метод, который возвращает объекты в моих views.py:

try:
    pyamf.register_class(Souvenir,  'com.rain.dennys.services.vo.Souvenir')
    pyamf.register_class(SouvenirAct,  'com.rain.dennys.services.vo.SouvenirAct')
except ValueError:
    print "Classes already registered"

@login_required
def get_souvenir_acts(http_request):
    user = http_request.user
    souvenirActs = SouvenirAct.objects.filter(user=user)
    return souvenirActs

Вот мой класс AS3:

package com.rain.dennys.model
{
    [RemoteClass (alias="com.rain.dennys.services.vo.SouvenirAct")]
    [Bindable]
    public class SouvenirAct extends RewardActBase
    {
        public var souvenir:Souvenir;
        public function SouvenirAct()
        {
        }
    }
}

Когда я вызываю сервис, я получаю обратно и массив анонимных объектов, хотя я сделал register_class в python и RemoteClass во Flex. Так что это не имеет смысла для меня. Должно быть, я что-то не так делаю?

Играя с этим, я пробовал несколько разных вещей. Единственное, что работало, это итерация массива во Flex и приведение элементов к объектам SouvenirAct следующим образом:

private function onResult(r:Array):void
{
    for each(var o:Object in r)
    {
        var c:SouvenirAct = o as SouvenirAct;
    }
}

Когда я делаю это во Flex, я получаю, что мои объекты SouvenirAct набираются так, как они должны быть, НО тогда все дочерние объекты-сувениры становятся нулевыми. Поэтому, когда я принудительно приводю объекты SouvenirAct в возвращаемом результате, я получаю нулевое значение для дочерних свойств, которые строго типизированы.

Кто-нибудь видел это раньше? Есть ли другой способ отображения классов?

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

Так что теперь я почти уверен, что проблема была в классе netConnection. Я отключил его, чтобы я мог использовать RemoteObject, и теперь все работает точно так, как ожидалось.

Вот как я подключался:

netConnection.connect("http://127.0.0.1:8000/gateway/");
netConnection.addEventListener(NetStatusEvent.NET_STATUS, onError);
var responder:Responder = new Responder(onResult, handleFault);

Затем я переключился на то, что описано здесь: http://www.adobe.com/devnet/flex/articles/flex_django.html Если кто-то еще сталкивается с этим, и вы используете netConnection, мой совет - использовать RemoteObject

0 голосов
/ 15 ноября 2011

Хорошо, так что это своего рода предположение, но это меня несколько раз поразило. Вы когда-нибудь создавали экземпляр Souvenir где-нибудь в вашем гибком приложении? Если нет ... AS не потрудился скомпилировать его, и вы получите анонимные объекты обратно.

Когда вы выполняете свой циклический блок кода onResult, он работает, потому что вы создаете экземпляр объекта SouvenirAct, но никогда не создаете экземпляр Souvenir (дочерний элемент), поэтому он все еще равен нулю, поскольку ActionScript никогда не компилировал его ... Попробуйте это до звонка в сервис

//TODO: remove me later
var imjustheretocompile:Souvenir = new Souvenir();
var alsoCompileMetoo:SouvenirAct = new SouvenirAct();

Теперь, когда вы создали экземпляр SouvenirAct, он должен быть скомпилирован в ваше приложение. Обычно это никогда не является проблемой, так как мы предполагаем, что вы будете использовать этот класс в какой-то момент, тогда вы можете вернуться и удалить переменные imjustheretocompile и alsoCompileMetoo.

...