Как проверить, есть ли модель в наборе ключей 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)