Не удается выполнить GET-запрос, используя email в качестве первичного ключа - "detail": "Не найдено".
Я пытаюсь выполнить GET-запрос к API, который возвращает соответствующую запись, но продолжаю получать not found
.
Если я вызову:
http://127.0.0.1:8000/bookings/booking/
Я могу получить все записи, но когда я пытаюсь получить одну запись, основанную на первичном ключе (который является адресом электронной почты (вложенный объект) - да, я рассматривал возможность изменить это, поскольку я читал, что это плохая практика по многим причинам). Он просто возвращает деталь не найдена. Другие конечные точки, где первичным ключом является ID, работают просто отлично.
http://127.0.0.1:8000/bookings/booking/2customer%40business2.com/
Может кто-нибудь объяснить мне, почему электронная почта не возвращает запись.
но я продолжаю получать:
"detail": "Not found."
models.py
class CustomerBookings(models.Model):
completed = models.BooleanField()
booking_startdate_time = models.DateTimeField()
dynamic_slot = models.ForeignKey(DynamicSlot, blank=True, null= True, on_delete = models.SET_NULL, related_name="%(class)s_dynamicslot")
customer = models.OneToOneField(Customer, primary_key=True, blank=True, on_delete = models.CASCADE, related_name="%(class)s_customer")
views.py
class BookingAPIViewSet(viewsets.ModelViewSet):
# permission_classes= [DjangoModelPermissions] - disabled for testing
serializer_class = CustomerBookingsSerializer
queryset = CustomerBookings.objects.all()
serializer.py
class BookingSerializer(serializers.ModelSerializer):
class Meta:
model = CustomerBookings
fields = ('__all__')
Попробуйте получить результат запроса с помощью Model.object.get(pk='2customer%40business2.com') или используйте Model.object.all().get(pk='2customer%40business2.com').
Вы также можете использовать get_object_or_404 для тестирования, импортировав его следующим образом;
from django.shortcuts import get_object_or_404
<<<Но судя по сообщению об ошибке, которое вы получаете, данные, которые вы пытаетесь получить из БД, не существуют, поэтому вы получаете сообщение "Not found".
Это то же самое, что использовать get_object_or_404. Он вернет 404(Not found), если данных нет в вашей БД.
Здесь есть 2 предупреждения:
- Ваша поисковая фраза URL Encoded, вы можете увидеть что-то вроде
%40
во фразе.
import urllib
urllib.parse.unquote("2customer%40business2.com")
- Ваш ModelViewSet хочет
id
модель Booking здесь в пути, как:/booking/1123/
. Вам нужно переопределить метод.retrieve()
классаBookingAPIViewSet
и сделать возможным поиск по другому полю, например, по электронной почте. docs. Установите точку останова в начале метода и посмотрите, какие args и kwargs он принимает.