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 Django
  • ModelB, który zawiera pole klucza obcego do ModelA
  • ModelC, który zawiera pole klucza obcego do ModelB
  • ModelD, który zawiera pole klucza obcego do ModelC
  • ModelE, który zawiera pole klucza obcego do ModelD

Szczegóły modelu:

  • ModelE może zawierać dziesiątki/setki/tysiące wpisów dla dowolnego wpisu
  • ModelC. Dodatkowo ModelC może zawierać dziesiątki/setki/tysiące wpisów dla dowolnego wpisu ModelB

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

Zrzut ekranu limitu czasu

4
golkedj 20 listopad 2018, 17:00

1 odpowiedź

Najlepsza odpowiedź

Z dyskusji w komentarzach doszedłem do następujących wniosków:

  • Ustawienie on_delete na CASCADE 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 na PROTECT 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ę

1
golkedj 20 listopad 2018, 18:30