Как я могу использовать Flex для доступа к полям с внешними ключами в Django?

У меня есть следующий код 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. Теперь я хотел бы изменить имя автора, когда я звоню в BookVO во Flex. Таким образом, я ожидаю, что код, подобный следующему, будет работать, но "имя_втора" приводит к нулю:

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

Я понимаю, что мог бы вызывать AuthorVO напрямую, но суть этого вопроса в том, как вы можете извлекать значения с внешним ключом, используя Flex, когда ваши VO привязаны к удаленному объекту? В настоящее время я использую PyAMF для устранения разрыва между Flex и Django, но я не уверен, что это актуально.

2 ответа

Решение

Хорошо, вот пример...

Модель:

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)

и вот мой Actionscript для принимающей стороны вызова 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_related(), то увижу ошибку:

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

Вы должны попробовать другой метод с вашим RemoteClass... так что select_related может не быть проблемой вообще... (иначе мой первый ответ не был бы проигнорирован.) Остальное зависит от вас.

Когда вы получите свою книгу из базы данных, попробуйте использовать select_related()

который находится внизу на этой странице:
http://docs.djangoproject.com/en/dev/ref/models/querysets/

он "автоматически" будет следовать "отношениям внешнего ключа, выбирая эти дополнительные данные связанного объекта при выполнении своего запроса. Это повышение производительности, которое приводит к (иногда значительно) большим запросам, но означает более позднее использование отношений внешнего ключа, выигранных не требует запросов к базе данных."

Мне нравится, как беспрепятственный доступ к базе данных через PyAMF от Flex. Это действительно великолепно.

Другие вопросы по тегам