Django 모델에서 레코드를 삭제하는 방법은 무엇입니까?


267

특정 레코드를 삭제하고 싶습니다. 와 같은

delete from table_name where id = 1;

에서 어떻게 할 수 django model있습니까?


16
질문 해 주셔서 감사합니다. 응답 투표 수와 조회 수에 의해 입증되는 것처럼 RTFM은 Google 검색 및 SO보다 훨씬 오래 걸립니다.
Freedom_Ben

8
@Freedom_Ben으로하지만, 미래의 독자 합의은 F * 수동 어쨌든처럼,이 당신을 위해 무엇을 찾고있는 것을 : docs.djangoproject.com/en/dev/topics/db/queries/...
Dinei

답변:


512

몇 가지 방법이 있습니다.

직접 삭제하려면 :

SomeModel.objects.filter(id=id).delete()

인스턴스에서 삭제하려면 :

instance = SomeModel.objects.get(id=id)
instance.delete()

50
첫 번째는 객체의 .delete () 메소드를 호출하지 않으므로 해당 메소드에 '정리'코드가 있으면 호출되지 않습니다. 일반적으로 문제는 아니지만 명심할 가치가 있습니다.
Matthew Schinckel

8
@Matthew Schinckel : 맞습니다. 사용자 지정 삭제 방법을 사용하려면 pre_delete또는 post_delete신호를 대신 사용해야합니다 .
Wolph

2
DJango 1.4 이후의 상황을 모르겠지만 실제로 모든 PK를 가져 와서 해당 PK에 의해 삭제됩니다. 예를 들어 임의의 필드로 삭제하면 SQL에 비해 속도가 느려질 수 있습니다 ... :(
Vajk Hermecz

1
@VajkHermecz : 삭제 신호로 인해 예상되는 동작입니다. Django 신호 시스템은 모든 데이터베이스 변경 사항을 추적해야합니다 (버전 변경과 같이).
Wolph

3
의 반환 값을 사용하여 delete()삭제 한 내용을 확인할 수 있습니다. 삭제 된 객체의 개수가 포함 된 튜플과 삭제 된 유형에 대한 세부 사항이 포함 된 사전을 반환합니다 (예 :) (1, {'yourapp.SomeModel': 1}).
mcb

37
MyModel.objects.get(pk=1).delete()

지정된 기본 키를 가진 객체가 없으면 지정된 객체를 검색하려고 시도하기 때문에 예외가 발생합니다.

MyModel.objects.filter(pk=1).delete()

지정된 기본 키를 가진 객체가 존재하지 않고 직접 쿼리를 생성하는 경우 예외가 발생하지 않습니다.

DELETE FROM my_models where id=1

1
에 오타가 MyModel.object.filter(pk=1).delete()있습니다. "객체"여야합니다.
Nigel

7

하나의 항목을 삭제하려는 경우

wishlist = Wishlist.objects.get(id = 20)
wishlist.delete()

예를 들어 Wishlist의 모든 항목을 삭제하려면

Wishlist.objects.all().delete()

7

하나의 인스턴스를 삭제하려면 코드를 작성하십시오.

delet= Account.objects.get(id= 5)
delet.delete()

모든 인스턴스를 삭제하려면 코드를 작성하십시오

delet= Account.objects.all()
delete.delete()

6

Wolph는 좋은 답변 중심의 코드를 제공했습니다. 사람들의 참고를 위해 공식 문서를 여기에 붙여 드리겠습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.