4

次の Django および Flex コードがあります。

ジャンゴ

class Author(models.Model):
  name = models.CharField(max_length=30)

class Book(models.Model):
  title = models.CharField(max_length=30)
  author = models.ForeignKeyField(Author)

フレックス

package com.myproject.models.vo
{
    [Bindable]
    [RemoteClass(alias="myproject.models.Book")]

    public class BookVO
    {
        public var id:int;
        public var title:String;
        public var author: AuthorVO;
    }
}

この例でわかるように、Author は Book モデルの外部キーです。Flex で BookVO を呼び出すときに、著者の名前にアクセスしたいと考えています。そのため、次のようなコードが機能することを期待していますが、「author_name」は null になります。

var book = new BookVO();
var author_name = book.author.name;

AuthorVO を直接呼び出すことができることはわかっていますが、この質問の要点は、VO がリモート オブジェクトにバインドされている場合に、Flex を使用して外部キーの値を取得するにはどうすればよいかということです。現在、Flex と Django の間のギャップを埋めるために PyAMF を使用していますが、それが適切かどうかはわかりません。

4

2 に答える 2

1

わかりました、ここに例があります...

モデル:

class Logger(models.Model):
    lname = models.CharField(max_length=80)

    def __unicode__(self):
        return self.lname
    #
#

class DataSource(models.Model):
    dsname = models.CharField(max_length=80)
    def __unicode__(self):
        return self.dsname
    #
#

class LoggedEvent(models.Model):
    # who's data is this?
    who = models.ForeignKey(Logger)
    # what source?
    source = models.ForeignKey(DataSource)
    # the day (and, for some events also the time)
    when = models.DateTimeField()
    # the textual description of the event, often the raw data
    what = models.CharField(max_length=200)
    # from -1.0 to 1.0 this is the relative
    # importance of the event
    weight = models.FloatField()

    def __unicode__(self):
        return u"%2.2f %s:%s - %s" % (self.weight, self.source, self.who, self.what)
    #
#

これが私のamfgateway.pyです

def fetch_events(request, source):
    events = LoggedEvent.objects.select_related().all()
    return events
#

services = {
    'recall.fetch_events': fetch_events,
}

gateway = DjangoGateway(services)

AMF 呼び出しの受信側の Actionscript は次のとおりです。

protected function onRetrievedEvents(result: Object): void {

    for each(var evt: Object in result) {
        var who: Object = evt._who_cache.lname;

...

evt._who_cache.lname には select_related() が取り込まれ、関連する選択が欠落している場合は欠落します。select_related() 呼び出しを取り除くと、次のエラーが表示されます。

TypeError: Error #1010: A term is undefined and has no properties.

あなたはRemoteClassで別のテクニックを試しているに違いありません...だから、select_relatedはまったく問題にならないかもしれません...(そうでなければ、私の最初の答えは無視されなかったでしょう.)残りはあなた次第です.

于 2009-01-27T12:31:10.947 に答える
0

データベースから本を入手するときは、select_related()を使用してみてください

これはこのページのずっと下にあります:http:
//docs.djangoproject.com/en/dev/ref/models/querysets/

「外部キー関係を自動的に「追跡」し、クエリの実行時に追加の関連オブジェクトデータを選択します。これはパフォーマンスを向上させるものであり、クエリが(場合によってははるかに)大きくなりますが、後で外部キー関係を使用すると勝ちます。データベースクエリは必要ありません。」

FlexのPyAMFを介したデータベースへのアクセスがいかにシームレスであるかが大好きです。本当に素晴らしいです。

于 2009-01-26T20:25:12.300 に答える