Где фактическая выборка из базы данных выполняется в drf list()
Как вы, возможно, знаете, наборы querysets выполняют фактическую выборку данных только при их оценке, например, при итерации над ними. Я хочу поместить эту фактическую выборку в celery, поэтому мне нужно поймать метод, в котором происходит фактическая выборка данных из базы данных во время жизненного цикла drf. что это?
Я погружаюсь в исходный код drf, но поскольку у меня не так много времени, любая помощь будет оценена по достоинству.
В сериализаторе. Действительно, если вы сконструируете MySerializer(many=True)
, он обернет ваш MySerializer
в ListSerializer
, который использует MySerializer
в качестве дочернего.
В .to_representation(…)
[GitHub], он затем перечислит data
и вызовет субсериализатор каждого элемента:
def to_representation(self, data): '\n List of object instances -> List of dicts of primitive datatypes.\n' # Dealing with nested relationships, data can be a Manager, # so, first get a queryset from the Manager if needed iterable = ( data.all() if isinstance(data, models.manager.BaseManager) else data ) return [self.child.to_representation(item) for item in iterable]
Таким образом, в этом сценарии он перечисляет набор запросов, а затем позволяет .child
сериализовать каждый элемент по отдельности.
Я хочу поместить эту фактическую выборку в celery, поэтому мне нужно поймать метод, в котором происходит фактическая выборка данных из db во время жизненного цикла drf.
Если вы сделаете это, то, скорее всего, будет сгенерирован блоб такого же размера, который будет сериализован, и поэтому передача результата из celery обратно в бэкенд Django станет узким местом.