LINUX.ORG.RU

Клонирование/копирование объектов в Python (Django)

 deepcopy, ,


0

1

Всем привет.

Имеется следующий код:

import copy

phone_calls_f = copy.deepcopy(phone_calls)
phone_calls_f.filter(type_id__in=[1, 4, 7])
phone_calls = phone_calls_f.order_by('?').all()[:2]

phone_calls_s = copy.deepcopy(phone_calls)
phone_calls_s.filter(type_id__in=[8, 2, 3, 5])
phone_calls += phone_calls_s.order_by('?').all()[:3]

То есть фактически я клонирую объект модели, применяю к разными _КОПИЯМ_ разные фильтры, и пытаюсь получить два разных результата.

Но при попытке применить фильтр ко второму объекту (phone_calls_s), то я получаю ошибку, что мол вы уже выполнили slice. Хотя slice я выполнил к первому объекту.

Cannot filter a query once a slice has been taken.

Что я делаю не так?

★★★

queryset-ы ленивые, запросов всё равно будет два, так что копировать ничего не надо.

lampslave ★★
()

Копировать queryset'ы толку чуть, поскольку даже при глубоком копировании связанный с queryset курсор не меняется. То есть у тебя будут два питоновых класса использовать один и тот же курсор.

В джаного, для выхода из положения, есть специальная функция get_query_set(), служащая как раз для дублирования queryset'а с одновременным созданием нового курсора в копии.

Пример использования будет таким:

phone_call_qs1 = PhoneCall.objects.filter(....)
phone_call_qs2 = PhoneCall.objects.get_query_set().filter(...)

k0valenk0_igor ★★★
()
Ответ на: комментарий от provaton

Нет. Звонков одного типа мне нужно 2, другого 3.

VirRaa ★★★
() автор топика

Честно говоря, не понимаю, то ли это я ничего не понял, то ли это все, кто отписался в треде, ничего не поняли.

pc1 = phone_calls.filter(type_id__in=[1, 4, 7]).order_by('?')[:2]
pc2 = phone_calls.filter(type_id__in=[8, 2, 3, 5]).order_by('?')[:3]

r1 = list(pc1) + list(pc2)
# or
r2 = pc1 | pc2
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.