Ho lavorato allo sviluppo di alcuni servizi RESTful in Django da utilizzare con le app Flash e Android.Serializzazione di oggetti chiave esterna in Django
Lo sviluppo dell'interfaccia dei servizi è stato piuttosto semplice, ma ho riscontrato un problema con la serializzazione di oggetti che hanno una chiave esterna e molte e molte relazioni.
Ho un modello come questo:
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)
Poi vorrei eseguire una query su questo modello come questo, utilizzando select_related()
, per essere sicuri che le relazioni di chiave esterna sono seguiti:
artifact = Artifact.objects.select_related().get(pk=pk)
Una volta che ho l'oggetto, ho serializzare, e passare che torna a mio punto di vista:
serializers.serialize("json", [ artifact ])
Questo è quello che torno, si noti che le chiavi esterne (object_type e individuali) sono solo le id per i relativi oggetti correlati.
[
{
pk: 1
model: "artifacts.artifact"
fields: {
year_of_origin: 2010
name: "Dummy Title"
notes: ""
object_type: 1
individual: 1
}
}
]
Questo è grande, ma quello che speravo per quando si utilizza select_related()
era che sarebbe compilare automaticamente i campi chiave esterna con il relativo oggetto, id non solo dell'oggetto.
Sono recente convertito in Django, ma ho impiegato molto tempo a sviluppare con CakePHP.
Quello che mi piace davvero del Cake ORM era che avrebbe seguito le relazioni e creato oggetti nidificati per impostazione predefinita, con la possibilità di separare le relazioni quando stavi chiamando la tua query.
Ciò ha reso molto semplice l'astrazione dei servizi in un modo che non richiedeva alcun intervento caso per caso.
Vedo che Django non lo fa di default, ma c'è un modo per serializzare automaticamente un oggetto e tutti gli oggetti correlati? Qualsiasi consiglio o lettura sarebbe molto apprezzato.
[PEP-008] (http://www.python.org/dev/peps/pep-0008) –