/ / co to jest query.clone (), queryset.clone () dla w django? - django, django-queryset

co to jest query.clone (), queryset.clone () dla w django? - django, django-queryset

Widzę, że clone () jest szeroko używany w kodzie django

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

Do czego służy i czy powinienem naśladować zachowanie w moich metodach zapytania lub menedżera?

Odpowiedzi:

9 dla odpowiedzi № 1

Istnieją dwa główne powody clone():

  1. Pozwala na łańcuchowanie. Kiedy ty łańcuch kwerendy razem (na przykład wiele filter() wywołania), chcesz za każdym razem aktualizować nową kopię kwerendy.

  2. Pozwala uniknąć nieaktualnych wyników pamięci podręcznej. Od zapytań Pamięć podręczna ich wyniki, gdy są oceniane, jeśli chcesz upewnić się, że ponownie trafiłeś w bazę danych, musisz sklonować zestaw zapytań.

Jeśli wiesz, co robisz, możesz go użyć, ale pamiętaj, że nie jest to publiczny interfejs API. W tym interesującym Wątki deweloperów Django programiści mówią o tym, czy nie clone() powinien być publiczny. Odrzucają go, częściowo dlatego, że:

Największy problem z publicznym .clone() metoda jest prywatna ._clone() nie robi po prostu klonowania .W niektórych przypadkach klonowanie zmienia również sposób zachowania QuerySet.


10 dla odpowiedzi nr 2

Jak wskazuje Kevin jego odpowiedź, clone() Metoda nie jest udokumentowaną częścią interfejsu API Django. Jednakże all() metoda jest w pełni udokumentowany i robi to, czego prawdopodobnie chciałeś clone().

wszystko()

Zwraca kopię bieżącego zestawu kwerend (lubPodklasa QuerySet). Może to być przydatne w sytuacjach, w których możesz chcieć przekazać menedżer modelu lub QuerySet i dodatkowo filtrować wyniki. Po wywołaniu all () na dowolnym obiekcie, na pewno będziesz mieć QuerySet do pracy.

Gdy kwerenda jest oceniana, zwykle buforujejego wyniki. Jeśli dane w bazie danych mogły ulec zmianie od czasu, gdy został oceniony obiekt QuerySet, można uzyskać zaktualizowane wyniki dla tego samego zapytania, wywołując metodę all () na wcześniej sprawdzonym zestawie kwerend.