template - plantillas django
¿Cómo puedo usar Flex para acceder a campos de clave extranjera en Django? (2)
cuando obtenga su libro de la base de datos, intente usar select_related ()
que está muy abajo en esta página:
http://docs.djangoproject.com/en/dev/ref/models/querysets/
"automáticamente" seguirá "relaciones de clave foránea, seleccionando los datos adicionales del objeto relacionado cuando ejecuta su consulta. Este es un refuerzo de rendimiento que resulta en consultas (a veces mucho) más grandes pero significa el uso posterior de relaciones de clave externa ganadas no requiere consultas de base de datos. "
Me encanta lo fácil que es el acceso a la base de datos a través de PyAMF desde Flex. Es realmente brillante.
Tengo el siguiente código Django y 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)
Flexionar
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;
}
}
Como puede ver en este ejemplo, el autor es una clave externa en mi modelo de libro. Ahora me gustaría acceder al nombre del autor cuando llamo a mi BookVO en Flex. Como tal, esperaría que un código como el siguiente funcionara, pero "autor_name" da como resultado un valor nulo:
var book = new BookVO();
var author_name = book.author.name;
Me doy cuenta de que podría llamar directamente a un AuthorVO, pero el quid de esta pregunta es ¿cómo se pueden recuperar los valores de clave foránea utilizando Flex cuando sus VO están vinculados a un objeto remoto? Actualmente estoy usando PyAMF para cerrar la brecha entre Flex y Django, pero no estoy seguro de que sea relevante.
Ok, aquí hay un ejemplo ...
Modelo:
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)
#
#
Aquí está mi amfgateway.py
def fetch_events(request, source):
events = LoggedEvent.objects.select_related().all()
return events
#
services = {
''recall.fetch_events'': fetch_events,
}
gateway = DjangoGateway(services)
y aquí está mi Actionscript para el lado receptor de la llamada AMF:
protected function onRetrievedEvents(result: Object): void {
for each(var evt: Object in result) {
var who: Object = evt._who_cache.lname;
...
El evt._who_cache.lname se rellena con select_related () y falta cuando falta la selección relacionada. Si me deshago de la llamada a select_related (), entonces veo el error:
TypeError: Error #1010: A term is undefined and has no properties.
Debe probar una técnica diferente con su RemoteClass ... para que select_related no sea el problema en absoluto ... (de lo contrario, mi primera respuesta no se hubiera ignorado). El resto depende de usted.