【问题标题】:attempting to delete an object in many to one relation but will not delete django. Django rest framework试图删除多对一关系中的对象但不会删除 django。 Django 休息框架
【发布时间】:2018-08-23 17:31:44
【问题描述】:

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

代码没有删除对象。

在方法运行时,我的 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)

【问题讨论】:

  • 您是否与您的数据库进行了交叉检查?
  • @JerinPeterGeorge 我明白了。需要将 roompk 转换为 int

标签: django django-models django-rest-framework sql-delete cascading-deletes


【解决方案1】:

这是你的问题

if room.pk == roompk:

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

更好的方法是:

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 方法,则不会调用该方法。我认为也不会调用信号。但如果这在您的应用程序中无关紧要,那么这是最有效的。

【讨论】:

  • 谢谢。我将 roompk 转换为 int。你可以在下面看到我的答案。我喜欢你的两个答案。我正在按照现在的方式进行操作,因此我可以访问父对象场所。出于权限原因。感谢您抽出宝贵时间
  • 如果您使用我的第一个建议,那么您可以从房间对象中获取场地对象.. 例如venue = venueroom.venue.. 假设venue 是链接房间的 ForeignKey 字段的名称场地。如果一个场地可以有很多房间,而一个房间只能有一个场地,那么如果知道一个房间的pk,就不需要单独知道它所属的场地的pk。你可以从房间对象中得到它,django 会为你做这一切。
【解决方案2】:

想通了。

if room.pk == roompk:

roompk 是我需要转换成 int 的字符串

  if room.pk == int(roompk):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 2017-06-28
    • 2015-08-22
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    相关资源
    最近更新 更多