Сериализация объектов внешнего ключа в Django
Я работал над созданием некоторых сервисов RESTful в Django для использования с приложениями Flash и Android.
Разработка интерфейса служб была довольно простой, но я столкнулся с проблемой сериализации объектов, имеющих внешний ключ и многие-многие отношения.
У меня есть такая модель:
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 )
Затем я бы выполнить запрос на эту модель, как это, используяselect_related()
, чтобы быть уверенным, что соблюдаются отношения внешнего ключа:
artifact = Artifact.objects.select_related().get(pk=pk)
Как только у меня есть объект, я сериализую его и возвращаю его обратно в мое представление:
serializers.serialize( "json", [ artifact ] )
Это то, что я возвращаю, обратите внимание, что внешние ключи (object_type и Individual) являются просто идентификаторами связанных объектов.
[
{
pk: 1
model: "artifacts.artifact"
fields: {
year_of_origin: 2010
name: "Dummy Title"
notes: ""
object_type: 1
individual: 1
}
}
]
Это здорово, но на что я надеялся при использованииselect_related()
было то, что он автоматически заполнил бы поля внешнего ключа связанным объектом, а не только идентификатором объекта.
Я недавно перешел на Django, но потратил немало времени на разработку с CakePHP.
Что мне действительно нравится в Cake ORM, так это то, что он будет следовать отношениям и создавать вложенные объекты по умолчанию с возможностью отмены связей при вызове запроса.
Это позволило очень просто абстрагировать сервисы таким образом, чтобы не требовалось никакого вмешательства в каждом конкретном случае.
Я вижу, что Django не делает этого по умолчанию, но есть ли способ автоматической сериализации объекта и всех связанных с ним объектов? Любые советы или чтение будет высоко ценится.