He estado trabajando en el desarrollo de algunos servicios RESTful en Django para ser utilizado con aplicaciones Flash y Android.Serialización de objetos clave extranjeros en Django
El desarrollo de la interfaz de servicios ha sido bastante simple, pero he tenido un problema con la serialización de objetos que tienen clave externa y muchas relaciones.
Tengo un modelo como este:
class Artifact(models.Model):
name = models.CharField(max_length = 255)
year_of_origin = models.IntegerField(max_length = 4, blank = True, null = True)
object_type = models.ForeignKey(ObjectType, blank = True, null = True)
individual = models.ForeignKey(Individual, blank = True, null = True)
notes = models.TextField(blank = True, null = True)
entonces yo realizar una consulta sobre este modelo como este, usando select_related()
, para asegurarse de que las relaciones de clave externa se siguen:
artifact = Artifact.objects.select_related().get(pk=pk)
Una vez que tengo el objeto, lo serializo, y lo transfiero a mi vista:
serializers.serialize("json", [ artifact ])
Esto es lo que recibo, tenga en cuenta que las claves foráneas (object_type e individual) son solo las identificaciones de sus objetos relacionados.
[
{
pk: 1
model: "artifacts.artifact"
fields: {
year_of_origin: 2010
name: "Dummy Title"
notes: ""
object_type: 1
individual: 1
}
}
]
Esto es muy bueno, pero lo que yo esperaba cuando se utiliza select_related()
fue que sería automáticamente los campos de clave externa con el objeto relacionado, no sólo el ID de objeto.
Soy un reciente converso a Django, pero dedico bastante tiempo a desarrollar con CakePHP.
Lo que realmente me gusta de Cake ORM es que seguiría las relaciones y crearía objetos anidados por defecto, con la capacidad de desvincular las relaciones cuando estaba llamando a su consulta.
Esto hizo que fuera muy fácil abstraer los servicios de una manera que no requiriera ninguna intervención caso por caso.
Veo que Django no hace esto por defecto, pero ¿hay alguna forma de serializar automáticamente un objeto y todos sus objetos relacionados? Cualquier consejo o lectura sería muy apreciado.
[PEP-008] (http://www.python.org/dev/peps/pep-0008) –