【问题标题】:how to check if a model is in a models foriegn key set? Django, django rest framework如何检查模型是否在模型外键集中? django,django rest框架
【发布时间】:2018-03-14 19:51:19
【问题描述】:

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

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

我正在尝试在我的 rest 框架中设置我的 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 循环后更新这个问题,或者如果我发现一切正常,我可能会删除它。

我的问题是如何设置房间并检查是否包含我正在搜索的 roompk 的房间。

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

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

【问题讨论】:

  • 检查我的答案,您正在尝试访问 room_set 对象,但您应该访问 room_set.all() (可迭代)
  • @Walucas 嘿,谢谢它确实有帮助,我刚刚实现了它,但看起来我仍然有问题我现在正在编辑我的问题以解决它。

标签: django django-rest-framework django-related-manager


【解决方案1】:

添加您的模型以帮助解决问题....但这是您访问 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({})

【讨论】:

  • 这个还是不错的,但是现在我们必须写一个异常,以防过滤器找不到roompk。它本质上是我的答案,但调用 django 方法。我喜欢我的是我添加了逻辑来处理在房间列表中找不到 roompk 的问题。谢谢你的努力!你帮了我很大的忙!
【解决方案2】:

所以我最终这样做了:

我在房间组中找到房间对象后就抓住它。通过查询房间对象的数据库。不过,我对这个答案并不满意。正如我想象的那样, room_set 已经可以访问房间对象了?我不能就这样删除它吗?如果可以的话,我会很感激比我更好的答案。无论如何,这就是我所做的。

 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)

【讨论】:

  • 这是一个非常糟糕的方法。当实际只需要一个时,它可能涉及数百次数据库查找。
  • @DanielRoseman 那么你有什么建议可以让我检查用户是否有权访问场地?我没有从你那里看到更好的解决方案,只是批评。
猜你喜欢
  • 2017-03-27
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2018-03-10
  • 2018-12-10
  • 2014-11-11
  • 2021-01-05
相关资源
最近更新 更多