Я бачу, що клон () широко використовується в коді джанго
queryset.query.clone()
queryset.clone()
Що це таке, і чи слід мені імітувати цю поведінку в моїх методах запиту або менеджера?
Відповіді:
9 для відповіді № 1Для цього є дві основні причини clone()
:
Це дозволяє зчеплення. Коли ти ланцюг querysets разом (наприклад, кілька
filter()
дзвінки), ви хочете отримати нову копію queryset кожного разу, коли ви можете змінити.Це дозволяє уникнути застарілих результатів кешування. З querysets кеш-пам'ять їх результати, коли вони оцінюються, якщо ви хочете переконатися, що ви потрапили в базу даних знову, вам потрібно клонувати queryset.
Якщо ви знаєте, що ви робите, ви можете використовувати його, але зауважте, що це не публічний API. У цьому цікаво Джанго розробники нитки розробники говорять про чи ні clone()
повинен бути загальнодоступним. Вони вирішують це, зокрема:
Найбільша проблема з громадськістю
.clone()
метод є приватним._clone()
Клонування не відбувається. Є деякі випадки, коли клонування також змінює поведінку QuerySet.
10 за відповідь № 2
Як підкреслює Кевін його відповідь, the clone()
метод не є документованою частиною API Django. Однак, all()
метод повністю документовано, і робить те, що ви, напевно, хотіли clone()
.
все ()
Повертає копію поточного QuerySet (абоПідклас QuerySet) Це може бути корисним у ситуаціях, коли ви, можливо, захочете передати як менеджеру моделей, так і QuerySet і виконати подальшу фільтрацію результату. Після виклику всіх () на будь-який об'єкт, ви обов'язково матимете QuerySet для роботи.
Коли оцінюється QuerySet, зазвичай він кешуєйого результати. Якщо дані в базі даних могли змінюватися після того, як було проведено оцінку QuerySet, ви можете отримати оновлені результати для одного запиту, викликавши всі () на попередньо оціненій QuerySet.