В проекте используется DjangoFullSerializermodels.py
# -*- coding: utf8 -*
from django.db import models
class pizza(models.Model):
name = models.CharField(max_length=250)
toppings = models.ManyToManyField('topping', related_name='pizza_toppings', null=False, blank=False)
class Meta:
db_table = "pizza"
def __unicode__(self):
return u"%s (%s)" % (self.name, u", ".join([topping.name for topping in self.toppings.all()]))
class topping(models.Model):
name = models.CharField(max_length=250)
#pizzas = models.ManyToManyField('pizza', related_name='pizza_toppings', null=False, blank=False)
class Meta:
db_table = "toppings"
def __unicode__(self):
return self.name
Если вывести все объекты pizza, видим следующее
>>> import simplejson as json
>>> from django.core import serializers
>>> from shop.models import *
>>> qs = pizza.objects.prefetch_related('toppings')
>>> qs
[, , ]
При этом в MySQL логе видим следующие запросы:
130401 22:38:48 21 Connect test@localhost on project
21 Query SET NAMES utf8
21 Query set autocommit=0
21 Query SET SQL_AUTO_IS_NULL = 0
21 Query SELECT `pizza`.`id`, `pizza`.`name` FROM `pizza` LIMIT 21
21 Query SELECT (`pizza_toppings`.`pizza_id`) AS `_prefetch_related_val`, `toppings`.`id`, `toppings`.`name` FROM `toppings` INNER JOIN `pizza_toppings` ON (`toppings`.`id` = `pizza_toppings`.`topping_id`) WHERE `pizza_toppings`.`pizza_id` IN (1, 2, 3)
т.е. у нас для отображения всех строк из pizza, включая связанную таблицу по Many2Many, произведено всего 2 запросаА вот если этот QuerySet отдать в сериализатор:
>>> json = serializers.serialize('json', qs, indent=4, relations=('toppings'))
>>> json
то в логе MySQL на каждую строчку из pizza буде сделан дополнительный запрос, как если бы мы не использовали .prefetch_related('toppings')
130401 22:39:07 21 Query SELECT `pizza`.`id`, `pizza`.`name` FROM `pizza`
21 Query SELECT (`pizza_toppings`.`pizza_id`) AS `_prefetch_related_val`, `toppings`.`id`, `toppings`.`name` FROM `toppings` INNER JOIN `pizza_toppings` ON (`toppings`.`id` = `pizza_toppings`.`topping_id`) WHERE `pizza_toppings`.`pizza_id` IN (1, 2, 3)
21 Query SELECT `toppings`.`id`, `toppings`.`name` FROM `toppings` INNER JOIN `pizza_toppings` ON (`toppings`.`id` = `pizza_toppings`.`topping_id`) WHERE `pizza_toppings`.`pizza_id` = 1
21 Query SELECT `toppings`.`id`, `toppings`.`name` FROM `toppings` INNER JOIN `pizza_toppings` ON (`toppings`.`id` = `pizza_toppings`.`topping_id`) WHERE `pizza_toppings`.`pizza_id` = 2
21 Query SELECT `toppings`.`id`, `toppings`.`name` FROM `toppings` INNER JOIN `pizza_toppings` ON (`toppings`.`id` = `pizza_toppings`.`topping_id`) WHERE `pizza_toppings`.`pizza_id` = 3
Вопрос - как сделать, что бы для сериализации не совершалось так много запросов?