Вот сценарий:Сериализация нескольких моделей в одном виде
У меня есть две модели; FileObj и DirObj.
class DirObj(models.Model):
[...]
parent = models.ForeignKey('self')
[...]
class FileObj(models.Model):
[...]
parent = models.ForeignKey(DirObj)
[...]
И у меня есть следующие сериализаторы:
class FileObjSerializer(serializers.ModelSerializer):
[...]
class Meta:
model = FileObj
class DirObjSerializer(serializers.HyperlinkedModelSerializer):
[...]
parent = serializers.HyperlinkedRelatedField(
view_name = 'dirobj-detail')
class Meta:
model = DirObj
И давайте говорить, что, когда пользователь переходит на «/ директории/[dir_id]» Я хочу, чтобы вернуть файл и содержимое каталогов DirObj, заданный «dir_id» в одном представлении, который использует два разных сериализатора. Сейчас у меня есть (не точно, но достаточно, чтобы вы получите суть близко) следующее:
class DirContents(generics.GenericAPIView):
def get(self, request, *args, **kwargs):
files = FileObj.objects.filter(parent = kwargs.get('dir_id'))
dirs = DirObj.objects.filter(parent = kwargs.get('dir_id'))
files_serializer = FileObjSerializer(files, many = True)
dirs_serializer = DirObjSerializer(dirs, many = True)
response = files_serializer.data + dirs_serializer.data
return Response(response)
Это чувствует, как уродливые взломать. Он также игнорирует любые гиперссылки, которые обычно отображались при просмотре API (т. Е. ГиперссылкиRelatedFields не отображаются в виде гиперссылок, как они должны.) Есть ли способ сериализации произвольного количества моделей и возврата их в одном представлении без нарушая API-интерфейс, доступный для просмотра, и/или должен сделать (что я предполагаю) кучу дополнительной работы, чтобы заставить гиперссылку работать правильно?
Заранее благодарен!
Передача в контексте действительно фиксировала гиперссылку. Я продолжу искать чистый способ сериализации моделей, но ваш ответ в значительной степени отвечает на мой вопрос (и дает мне немного больше, чтобы читать дальше.) Спасибо! – musashiXXX