试图删除多对一关系中的对象但不会删除 django。 Django 休息框架

attempting to delete an object in many to one relation but will not delete django. Django rest framework

我正在删除多对一关系中的模型。您会注意到在 delete 方法中我公开了父模型。这是我稍后会写的权限。

代码没有删除对象。

在方法运行时,我的 javascript 删除了对象。但是如果我重新加载页面,我会取回对象。

会发生什么?

 def delete(self, request, *args, **kwargs):
        venuepk = kwargs.get('venuepk', None)
        venue = get_object_or_404(Venue, pk=venuepk)
        venuerooms = venue.room_set.all()
        roompk = kwargs.get('roompk')
        roomobject = None
        for room in venuerooms:
            if room.pk == roompk:
               roomobject = Room.objects.get(pk=roompk)
               roomobject.delete()
               return Response({})

        return Response(status.HTTP_404_NOT_FOUND)

明白了。

if room.pk == roompk:

roompk 是一个字符串,我需要转换成一个 int

  if room.pk == int(roompk):

这是你的问题

if room.pk == roompk:

房间的pk是字符串还是整数??可能是一个整数。而您从 kwargs 获得的 venuepk 的值很可能是一个字符串。因此比较会失败。

更好的方法是:

venueroom = VenueRoom.objects.filter(roompk).first()
if venueroom is not None:
    # you can get venue from room.. assuming the name of the ForeignKey 
    # field connecting room to its venue is called `venue`.
    venue = venueroom.venue
    venueroom.delete()
    # return success
else:
    # return failure

这避免了必须将所有相关对象放入内存才能找到正确对象的问题。它只向数据库询问您需要的一个对象。查找之所以有效,是因为在进行过滤时,整数列和整数的字符串表示之间的比较是可以的。至少在 postgres 中它是有效的...

if venue.room_set.filter(pk=venuepk).delete():
    # return success
else:
    # return failure

这根本没有把对象带入内存,它只是告诉数据库找到匹配的对象并删除它。但是,如果您重写了模型上的 delete 方法,则不会调用该方法。我认为信号也不会被调用。但如果这在您的应用程序中无关紧要,那么这是最有效的。