Obecnie zajmuję się starszym systemem, podczas gdy nowy system jest wprowadzany. Ostatnio zauważyłem, że przy próbie usunięcia niektórych obiektów z określonego modelu pojawia się limit czasu. Śledziłem to jako związane z następującym pytaniem, które ma zaakceptowaną odpowiedź: Administrator Django zawiesza się (do czasu błędu przekroczenia limitu czasu) dla określonego modelu podczas próby edycji/tworzenia
Problem, który mam, polega na tym, że obiekty, które są powiązane, nie są bezpośrednio związane z moim modelem.
Na przykład mam następujące modele (ogólnie nazwane, aby pozostać niejasne ze względu na IP w mojej firmie):
ModelA
, czyli model, z którym widzę problem podczas usuwania ze strony administratora DjangoModelB
, który zawiera pole klucza obcego doModelA
ModelC
, który zawiera pole klucza obcego doModelB
ModelD
, który zawiera pole klucza obcego doModelC
ModelE
, który zawiera pole klucza obcego doModelD
Szczegóły modelu:
ModelE
może zawierać dziesiątki/setki/tysiące wpisów dla dowolnego wpisuModelC
. DodatkowoModelC
może zawierać dziesiątki/setki/tysiące wpisów dla dowolnego wpisuModelB
Obecnie, gdy próbuję usunąć ModelA
, Django próbuje wygenerować wszystkie powiązane obiekty aż do ModelE
, co powoduje w niektórych przypadkach przekroczenie limitu czasu z dużą liczbą powiązanych ModelC
i ModelE
.
Czy istnieje sposób na uniknięcie tego przez zastąpienie niestandardowego szablonu, takiego jak delete_confirmation_template lub inną metodą? Idealnie chciałbym jeszcze pokazać podsumowanie, ale nie jestem pewien, czy będzie to możliwe przy naturze tego wydania.
Kilka szczegółów dla kontekstu:
- Czuję, że może to być spowodowane słabą ogólną strukturą naszego schematu DB, ale jak wspomniałem wcześniej, jest to system Legacy.
- Nie potrzebuję natychmiastowej naprawy, ponieważ tak naprawdę nigdy nie usunę wpisów dla tego modelu, z wyjątkiem mojego obecnego scenariusza / zadania czyszczenia zduplikowanych wpisów (błąd użytkownika nie jest poprawnie kontrolowany przez formularze; Formularze teraz to sprawdzają), który jest obecnie zrobić za pomocą skryptu migracji. Po prostu zauważyłem to, próbując uporządkować rzeczy i wykorzystać tę stronę pośrednią jako kontrolę zdrowia podczas testowania wspomnianego skryptu migracji
1 odpowiedź
Z dyskusji w komentarzach doszedłem do następujących wniosków:
- Ustawienie
on_delete
naCASCADE
dla modeli było nieprawidłowe i powodowało bardzo wysokie czasy pobierania powiązanych obiektów podczas próby usunięcia modelu - Ponieważ nie chcę zezwalać na usuwanie tych obiektów, gdy inne specyficzne modele mają z nimi powiązania, przeanalizowałem i odpowiednio ustawiłem
on_delete
naPROTECT
tam, gdzie ma to zastosowanie - Teraz, gdy próbuję usunąć obiekt, nie pozwoli mi to usunąć obiektu z powodu chronionych powiązanych elementów. Rozwiązuje również problem z limitem czasu, który wcześniej obserwowałem
To pozwala mi nadal usuwać obiekty z tego modelu za pośrednictwem strony administratora Django JEŚLI nie mają powiązanych obiektów chronionych, co ostatecznie jest funkcjonalnością, której pragnę
Podobne pytania
Powiązane pytania
Nowe pytania
django
Django to framework aplikacji internetowych typu open source po stronie serwera, napisany w języku Python. Został zaprojektowany w celu zmniejszenia wysiłku potrzebnego do tworzenia złożonych witryn i aplikacji internetowych opartych na danych, ze szczególnym naciskiem na mniej kodu, brak nadmiarowości i bardziej jawny niż niejawny.