Задать вопрос
@Antigo_ptz

Django Rest Framework как вернуть в ответе вложенную сущность из другой базы данных?

У меня есть 2 БД, в одной из них таблица fields (поля id, name, field_type_id), в другой - field_type (поля id, name, description) Таблицы в разных БД, хоть связать их невозможно, но в таблице fields в поле field_type_id хранится айдишник записи из таблицы field_type. Загвоздка в том, как мне при сериализации сущностей из таблицы fields средствами DRF добавить вложенную сущность field_type и вернуть в json'е.
{
	"id": 1,
	"name": "myfield",
	"field_type": {
		"id": 25,
		"name": "text",
		"description": "plain text field"
	}
}

Если бы обе таблицы хранились в одной БД, то там все в общем несложно, это описано тут www.django-rest-framework.org/api-guide/relations/...
  • Вопрос задан
  • 1316 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Простите, я не тестировал то, что сейчас напишу, но почему бы Вам не попробовать следующее. Поскольку Django позволяет работать с несколькими базами данных одновременно, как описано здесь: https://docs.djangoproject.com/en/1.10/topics/db/m..., т.е. к примеру, вот так:
Fields.objects.using('fields_db').all()
FieldType.objects.using('field_types_db').all()

То Вы можете сделать сериалайзер для FeildType и указать к нему в качестве queryset
class FieldTypeSerializer(serializer.ModelSerializer):
    queryset = FieldType.objects.using('field_types_db').all()

Соответственно, для сущности Field сериалайзер будет выглядеть примерно вот так:
class FieldSerializer(serializers.ModelSerializer):
    field_type = FieldTypeSerializer()

Можно обойтись и без использования queryset.using(), сделав так, чтобы модель всегда была привязана к другой базе. Подробности читайте по ссылке выше.

UPD:
Можно попробовать не привязывать сериалайзер к модели
# наследование от serizliaers.Serializer вместо serializers.ModelSerializer
class FieldSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    field_type = FieldTypeSerializer()

Но в этом случае нужно будет подумать где и как передать ему данные от моделей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы