Скажем, у меня есть эта модель:Django-отдых-основа сериализатору делает много запросов
class Place(models.Model):
....
owner = ForeignKey(CustomUserModel)
....
И у меня есть эта DRF сериалайзер, который возвращает список Place
с (вид вызова он использует generics.ListAPIView
класс ФПИ):
class PlaceSerializer(serializers.ModelSerializer):
owner = UserModelSerializer() # Gets only specific fields for a place owner
class Meta:
model = Place
проблема, когда сериализатору получает запрос, который возвращает, скажем ... 50 мест, я могу видеть (в connection.queries
), что запрос делается для каждого owner
внешнего ключа отношения, который суммирует до большого количества o f запросов. Это, конечно, сильно влияет на производительность.
Также важно упомянуть, что для представления вызова, вызывающего сериализатор, у меня было get_queryset()
только возвращаемые Place
s, которые находятся на некотором расстоянии от центральной точки, используя пользовательский запрос. Для этого я использовал метод extra()
Django.
Я пробовал использовать select_related
и prefetch_related
с указанным выше запросом, но, похоже, это не имеет никакого отношения к запросам, производимым впоследствии сериализатором.
Что мне не хватает?
Спасибо за ваш отзыв, Том. Можно ли использовать атрибут 'queryset', если запрос должен получать значения из запроса? На данный момент я использую 'get_queryset()' по этой причине. – OrPo
Использование select_related внутри 'get_queryset' также будет работать. –
@TomChristie Привет, вы можете мне помочь? http://stackoverflow.com/questions/26744664/django-tweak-the-rest-framework-serializer-to-getting-a-different-json-structure – Abhishek