Как проверить, есть ли модель в наборе ключей foriegn моделей? Джанго, рамки отдыха Джанго

У меня есть модель комнаты, которая имеет отношение много к одному с местом проведения.

У места может быть много комнат.

Я пытаюсь настроить мои методы 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({})

Я надеюсь, что смогу просто объединить комнаты и проверить каждый объект в комнатах, но у меня есть сильное чувство, что это не сработает, потому что venuerooms - это не объекты 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() к моему определению

но теперь у меня новая ошибка. Это не имеет смысла, так как я явно переопределяю атрибут None в цикле for.

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

2 ответа

Решение

Добавьте свои модели, чтобы помочь с вопросом.... но вот как вы получаете доступ к 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({})

Таким образом я закончил тем, что сделал это:

схватил объект комнаты, как только я нашел его в номере. запрашивая базу данных для объекта комнаты. Я не доволен этим ответом, хотя. Как я себе представляю, у 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)
Другие вопросы по тегам