2012-01-26 2 views
1

장고에 모델이 있습니다. 그룹이 있고 그룹 안에는 카메라가 있습니다.Django 데이터베이스 쿼리

class Groups(models.Model): 
    groupName = models.CharField(max_length=255) 

class Cameras(models.Model): 
    group = models.ForeignKey(Groups) 
    cameraID = models.IntegerField() 

모델에서 카메라 또는 카메라 세트를 제거하려고 할 때.

camera = Cameras.objects.filter(cameraID=int(camID)) 
camera.delete() 

ID가 0보다 큰 카메라는 제거됩니다. 그러나 카메라 ID가 '0'인 경우 제거가 실패합니다. 왜 이렇게 될지 모든 아이디어.

+0

당신은 어떤 데이터베이스를 사용합니까? 쿼리 세트에서 사용하는 SQL을 보려고 했습니까? 이 경우 django-debugbar가 도움이 될 수 있습니다 – luc

+1

[django-debug-toolbar] (https://github.com/dcramer/django-debug-toolbar)입니다. 도움이 될 것입니다. – cha0site

+0

이 두 줄의 실행을 방해하는 다른 코드가 있습니까? 쉘에서'Cameras.objects.filter (cameraID = 0) .delete()'를 실행하려고하면 어떻게됩니까? –

답변

2

camera = Cameras.objects.get(pk=camID)을 사용해보십시오. 하나의 객체 만 가지고 있다는 것을 알고 계실 것입니다. 다음을 할 수 있습니다 camera.delete() 또한 ';' 문자를 사용하십시오.

+0

현재 예제 코드에 따르면 카메라의'pk'는'FYI '인'cameraID'가 아니다. ';'에 동의하십시오. 논평. 지금 예제를 정리합니다. – istruble

3

필터를 사용할 때 get과 달리 1 개만 반환되거나 오류가 발생할 수 있습니다. 당신이 필터에서 반환 된 모든 개체를 삭제하려면

, 그렇게처럼 반복 할 수 있습니다

cameras = Cameras.objects.filter(cameraID=int(camID)) 
## let's say this returns [<Camera:1>,<Camera:2>] 

for camera in cameras: 
    camera.delete() 
    ## this loop will delete each object in the query 
+1

아니요, filter는 QuerySet 객체를 반환하므로 반복 할 필요가 없습니다. QuerySets은'.delete()'메소드도 가지고있다 : https://docs.djangoproject.com/en/1.2/ref/models/querysets/#delete –

+0

나는 대답했다. 그것을 사용했습니다. 그것은 문서에서 말했듯이 queryset delete 메소드는 특별한 삭제 방법을 호출하지 않으며, OP에는 아무런 (나열된) 것이 없습니다. 차라리 나중에 고유 한 삭제 방법을 추가하면 나중에 변경하는 것에 대해 걱정할 필요가없는 여분의 코드 줄을 사용하고 싶습니다. –

+1

문제를 해결했습니다. Aparantly python은 짜증나는 값으로 0을 전달하면 값이 비어 있다고 가정합니다. 나는 x를 사용하지 않았다 : x가 0이면 그것이 잘못되었다고 생각했다. – TheMonkeyMan