Как я могу использовать Flex для доступа к полям с внешними ключами в Django? - PullRequest
4 голосов
/ 26 января 2009

У меня есть следующий код 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)

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

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

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

Ответы [ 2 ]

1 голос
/ 27 января 2009

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

Модель:

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 может не быть проблемой вообще ... (иначе мой первый ответ не был бы проигнорирован.) Остальное зависит от вас.

0 голосов
/ 26 января 2009

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

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

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

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

...