0

我有一个与场地具有多对一关系的房间模型。

一个场地可以有很多房间。

我正在尝试在我的休息框架中设置我的 http 方法,这样当我添加权限时,事情就会很好地工作。

因此,如果说有人想从场地中删除一个房间,我必须确保 1 该人有权访问该场地 2 该房间已连接到该场地

我想获取场地模型,然后获取场地模型 room_set 并检查 room_set 以查看是否存在带有我要删除的模型的房间主键的房间。

到目前为止我所拥有的:

class GetEditDeleteVenueRoom(APIView):

    def get(self, request, *args, **kwargs):
        pass

    def post(self, request, *args, **kwargs):
        print('wait its over here')



    def delete(self, request, *args, **kwargs):
        venuepk = kwargs.get('venuepk', None)
        venue = get_object_or_404(Venue, pk=venuepk)
        venuerooms = venue.room_set
        print(venuerooms)
        return Response({})

我希望我可以对场地房间进行交互并检查场地房间中的每个对象,但我有一种强烈的感觉,因为场地房间不是 python 对象,所以它不会工作?也许是的。我将在执行 for 循环后更新这个问题,或者如果我发现一切正常,我可能会删除它。

我的问题是如何设置房间并检查我正在寻找的房间是否在其中。

所以正如我所料,我尝试的代码出错了:

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

    print(venuerooms)
    return Response({})

我得到的错误:

File "/home/rickus/Documents/softwareProjects/211hospitality/suitsandtables/backend/virtualsuits/suitsandtables/venues/views.py", line 125, in delete
    for room in venuerooms:
TypeError: 'RelatedManager' object is not iterable

关于我能做什么的任何想法?

新编辑:

所以我实现了下面的答案并添加all()到我的场地房间定义中

但现在我有一个新错误。这个没有意义,因为我明显覆盖了 for 循环中的 None 属性。

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:
                print(room)
                roomobject = room
        roomobject.delete()

        print(venuerooms)
        return Response({})

错误:

File "/home/rickus/Documents/softwareProjects/211hospitality/suitsandtables/backend/virtualsuits/suitsandtables/venues/views.py", line 129, in delete
    roomobject.delete()
AttributeError: 'NoneType' object has no attribute 'delete'
[14/Mar/2018 20:01:53] "DELETE /api/suitsadmin/venue/1/room/15 HTTP/1.1
4

2 回答 2

0

添加您的模型以帮助解决问题....但这是您访问 room_set 的方式

def delete(self, request, *args, **kwargs):
    venuepk = kwargs.get('venuepk', None)
    venue = get_object_or_404(Venue, pk=venuepk)
    roompk = kwargs.get('roompk')
    room = venue.room_set.filter(pk=roompk)
    room.delete()
    return Response({})
于 2018-03-14T19:57:24.357 回答
0

so I ended up doing this:

grabbing the room object once I found it in the roomset. by querying the database for the room object. I am not happy with this answer though. As I would imagine the room_set already has access to the room object? Can't I just delete it that way? If I can I would appreciate a better answer than mine. Regardless here is what I did.

 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)
于 2018-03-14T20:10:32.277 回答