2013-07-06 2 views
2

Скажем, у меня есть эта модель: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 с указанным выше запросом, но, похоже, это не имеет никакого отношения к запросам, производимым впоследствии сериализатором.

Что мне не хватает?

ответ

2

select_related будет работать, как и ожидалось, с помощью сериализаторов.

Убедитесь, что вы устанавливаете это в атрибуте 'queryset' в представлении, если используете общие представления.

Использование select_related внутри 'get_queryset' также будет работать.

В противном случае единственное, что я могу предложить, это попытаться сузить проблему до некоторой отладки. Если вы все еще считаете, что есть проблема, и у вас есть минимальный пример, который будет реплицировать его, тогда поднимите вопрос в качестве билета или обсудите его в списке рассылки.

+0

Спасибо за ваш отзыв, Том. Можно ли использовать атрибут 'queryset', если запрос должен получать значения из запроса? На данный момент я использую 'get_queryset()' по этой причине. – OrPo

+0

Использование select_related внутри 'get_queryset' также будет работать. –

+0

@TomChristie Привет, вы можете мне помочь? http://stackoverflow.com/questions/26744664/django-tweak-the-rest-framework-serializer-to-getting-a-different-json-structure – Abhishek

Смежные вопросы