Мне нужен совет. Иногда возникают ситуации, когда в API мне нужно получить много данных из некоторых таблиц БД. И когда я пытаюсь получить все данные - это занимает много времени. Поэтому я использую небольшой велосипед для извлечения данных в одном запросе.
Пример:
class SomeModelSerializer(serializers.ModelSerializer):
related_name1 = serializers.SerializerMethodField()
related_name2 = serializers.SerializerMethodField()
related_name3 = serializers.SerializerMethodField()
def get_related_name1(self, obj):
return self.values[obj.id].get('related_table1__name')
def get_related_name2(self, obj):
return self.values[obj.id].get('related_table1__related_table2__name')
def get_related_name3(self, obj):
return self.values[obj.id].get('related_table3__name')
def __init__(self, *args, **kwargs):
super(SomeModelSerializer, self).__init__(*args, **kwargs)
# Collect all necessary data from BD.
self.values = {}
if self.instance:
for some_model_values in self.instance.values(
'id',
'related_table1__name',
'related_table1__related_table2__name',
'related_table3__name'
).iterator():
self.values[some_model_values['id']] = some_model_values
class Meta:
model = SomeModel
fields = ('id', 'related_name1', 'related_name2', 'related_name3')
Отлично работает в ситуациях, когда необходимо извлечь много данных, но это занимает больше времени при кодировании, чем простой сериализатор.
Это хорошая идея для оптимизации извлечения данных, или у вас есть другие решения для этой ситуации?
Это решение делает 2 запроса к БД для любого набора запросов.