2012-01-26 434 views
1

我在Django模型。它有一個組,組內有相機。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

你使用哪種數據庫?您是否嘗試查看queryset使用的sql? Django的debugbar可能有助於在這種情況下 – luc

+1

這是[Django的調試工具欄(https://github.com/dcramer/django-debug-toolbar),它可以幫助。 – cha0site

+0

有沒有其他的代碼可以阻止這兩行執行?如果你嘗試從shell執行'Cameras.objects.filter(cameraID = 0).delete()',會發生什麼? –

回答

2

嘗試使用camera = Cameras.objects.get(pk=camID)那麼你肯定知道你只得到了一個對象。然後,您可以camera.delete() 你也並不需要所有的「;」你的代碼中的字符。

+0

。同意';'評論。現在清理示例。 – istruble

3

當您使用過濾器,你可以得到0或多個對象返回,不像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

不,過濾器返回一個QuerySet對象,並且不需要迭代它。 QuerySets也有一個'.delete()'方法:https://docs.djangoproject.com/en/1.2/ref/models/querysets/#delete –

+0

我剛剛意識到,我回答後,雖然我從來沒有真正使用它。正如它在文檔中所說的,queryset delete方法不會調用任何特殊的刪除方法,而不是OP有任何(列出的)。我寧願有一行額外的代碼,如果我添加了獨特的刪除方法,我以後再也不用擔心更改 –

+1

我解決了問題。 aparantly python是煩人的,如果你傳遞一個0作爲一個值,它認爲它是空的。我使用如果不是x:並且如果x等於零,它認爲它是錯誤的。 – TheMonkeyMan