Serializando objetos de chave estrangeira no Django
Eu tenho trabalhado no desenvolvimento de alguns serviços RESTful no Django para serem usados com aplicativos Flash e Android.
O desenvolvimento da interface de serviços tem sido bastante simples, mas estou enfrentando um problema com a serialização de objetos com chave estrangeira e muitos e muitos relacionamentos.
Eu tenho um 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 )
Então, eu faria uma consulta nesse modelo assim, usandoselect_related()
, para garantir que os relacionamentos de chave estrangeira sejam seguidos:
artifact = Artifact.objects.select_related().get(pk=pk)
Depois de ter o objeto, serializo-o e transmito-o de volta à minha visão:
serializers.serialize( "json", [ artifact ] )
É isso que eu volto, observe que as chaves estrangeiras (object_type e individual) são apenas os IDs dos objetos relacionados.
[
{
pk: 1
model: "artifacts.artifact"
fields: {
year_of_origin: 2010
name: "Dummy Title"
notes: ""
object_type: 1
individual: 1
}
}
]
Isso é ótimo, mas o que eu esperava ao usarselect_related()
era que ele preenchia automaticamente os campos de chave estrangeira com o objeto relacionado, não apenas o ID do objeto.
Sou recém-convertido para Django, mas dedico bastante tempo ao desenvolvimento com o CakePHP.
O que eu realmente gosto no Cake ORM é que ele segue os relacionamentos e cria objetos aninhados por padrão, com a capacidade de desvincular os relacionamentos quando você chamava sua consulta.
Isso facilitou a abstração dos serviços de uma maneira que não exigia nenhuma intervenção caso a caso.
Vejo que o Django não faz isso por padrão, mas existe uma maneira de serializar automaticamente um objeto e todos os objetos relacionados? Qualquer dica ou leitura seria muito apreciada.