Где фактическая выборка из базы данных выполняется в 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 станет узким местом.

Вернуться на верх