2012-01-26 695 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