장고 에러 모음집

2022. 4. 23. 01:11

Model & DB

 

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`vanilla`.`#sql-1c10_73`, CONSTRAINT `document_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `_user` (`id`))

  • FK로 사용되는 필드가 바뀌거나 추가된 경우
  • 새로 추가된 필드에 값을 채워줘야 함(안 그러면 참조 무결성을 위반)
  • table자체를 삭제하고 새로 만드는 것을 추천

 

모델필드를 migrate까지해서 테이블을 만듬 >> db에서 테이블을 삭제하고, 장고에서도 makemigrations를 삭제하고 나서 다시 migrate를 해도 db에서 테이블이 생성되지 않음

 

순환 참조(circular import)

  • 다른앱의 모델들이 서로를 참조할 때 발생 ex)
    • A앱의 a모델을 생성할 때, B앱의 b모델을 참조하므로 A앱의  models.py에서 b모델을 import
    • 동시에  B앱의 b모델을 생성할 때 A앱의 a모델을 참조하므로, B앱의 models.py에서 a모델을 import
  • 특히 many to many필드를 선언해줄 떄 많이 발생한다
  • 해결책
    • 장고모델에서는 참조하려는 모델을 적어줄 때 '앱이름.테이블'과 같은 식으로 적어줄 수 있다. 이렇게 하면 import 자체가 필요가 없어져서, 순환참조의 문제를 해결할 수 있다.

  • 다음과 같이 참조하려는 테이블을 '앱이름.테이블명'과 같이 적어준다. 그렇게 하면 다른 앱의 테이블을 import할 필요조차 없어서 순환참조의 문제가 해결이 됨
  • 심지어 장고에서도 순환참조를 막기 위해 위의 사진처럼 str형태로 테이블을 참조하는 것을 권유함

 

AttributeError: 'str' object has no attribute '_meta'

  • makemigrations에서는 문제가 없엇음. migrate를 할 때 문제가 발생
  • 정확한 이유는 모르겠으나, many to many 필드부분에서 문제가 발생하는 것을 확인함. 실제 Db에서도 테이블의 manytomany필드 이전까지는 생성되고, manytomany필드에서 문제가 생겨서 해당 필드가 생성되지 않음을 확인
  • 해결책
    • manytomany필드 혹은, 다른필드를 복잡하게 참조하는 것처럼 보여지는 필드를 주석처리를 한후 makemigrations를 실행 > migrate > 그후에 주석처리를 제거하고 makemigrations를 다시 실행 > migrate도 다시 실행
    • 다른 필드를 참조하지 않는 필드와 테이블이 먼저 만들어졌고, 만들어진 필드와 테이블을 바탕으로 many to many필드가 순차적으로 선언되기 때문에 별다른 에러가 발생하지 않는것으로 추측됨. 정확한 이유에 대해서는 안나옴

 

makemigraton실행시 no changes detected

  • 아마 settings.py에서 installed app이 등록되지 않았을 가능성이 높다
  • 나는 git으로 왓다갓다하면서 settings에서 installed_app에 추가한 새앱들이 다 날라갔었음
  • 참고)https://snepbnt.tistory.com/251

 

 

BELATED ARTICLES

more