如何使用Flex访问Django中的外键字段?

时间:2009-01-26 19:56:07

标签: django flex pyamf

我有以下Django和Flex代码:

Django的

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

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

的Flex

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检索外键值?我目前正在使用PyAMF来弥合Flex和Django之间的差距,但我不确定这是否相关。

2 个答案:

答案 0 :(得分: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呼叫接收方的动作脚本:

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相关时丢失。如果我摆脱了select_related()调用,那么我会看到错误:

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

你必须使用RemoteClass尝试不同的技术...所以select_related可能根本就不是问题...(否则我的第一个答案就不会被否定了。)其余的由你决定。< / p>

答案 1 :(得分:0)

从数据库中获取图书时,请尝试使用select_related()

在这个页面上显示下来:
  http://docs.djangoproject.com/en/dev/ref/models/querysets/

它,“将自动”跟随“外键关系,在执行查询时选择其他相关对象数据。这是一个性能助推器,导致(有时很多)更大的查询,但意味着以后使用外键 - 关键关系不需要数据库查询。“

我一直喜欢通过Flex的PyAMF无缝访问数据库。真是太棒了。