/ / Що таке query.clone (), queryset.clone () для в django? - джанго, джанго-керисет

Що таке query.clone (), queryset.clone () для в django? - джанго, джанго-керисет

Я бачу, що клон () широко використовується в коді джанго

queryset.query.clone()
queryset.clone()

Що це таке, і чи слід мені імітувати цю поведінку в моїх методах запиту або менеджера?

Відповіді:

9 для відповіді № 1

Для цього є дві основні причини clone():

  1. Це дозволяє зчеплення. Коли ти ланцюг querysets разом (наприклад, кілька filter() дзвінки), ви хочете отримати нову копію queryset кожного разу, коли ви можете змінити.

  2. Це дозволяє уникнути застарілих результатів кешування. З querysets кеш-пам'ять їх результати, коли вони оцінюються, якщо ви хочете переконатися, що ви потрапили в базу даних знову, вам потрібно клонувати queryset.

Якщо ви знаєте, що ви робите, ви можете використовувати його, але зауважте, що це не публічний API. У цьому цікаво Джанго розробники нитки розробники говорять про чи ні clone() повинен бути загальнодоступним. Вони вирішують це, зокрема:

Найбільша проблема з громадськістю .clone() метод є приватним ._clone() Клонування не відбувається. Є деякі випадки, коли клонування також змінює поведінку QuerySet.


10 за відповідь № 2

Як підкреслює Кевін його відповідь, the clone() метод не є документованою частиною API Django. Однак, all() метод повністю документовано, і робить те, що ви, напевно, хотіли clone().

все ()

Повертає копію поточного QuerySet (абоПідклас QuerySet) Це може бути корисним у ситуаціях, коли ви, можливо, захочете передати як менеджеру моделей, так і QuerySet і виконати подальшу фільтрацію результату. Після виклику всіх () на будь-який об'єкт, ви обов'язково матимете QuerySet для роботи.

Коли оцінюється QuerySet, зазвичай він кешуєйого результати. Якщо дані в базі даних могли змінюватися після того, як було проведено оцінку QuerySet, ви можете отримати оновлені результати для одного запиту, викликавши всі () на попередньо оціненій QuerySet.