Как я могу использовать 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. Это действительно великолепно.