Не удается выполнить 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 предупреждения:

  1. Ваша поисковая фраза URL Encoded, вы можете увидеть что-то вроде %40 во фразе.
import urllib

urllib.parse.unquote("2customer%40business2.com")
  1. Ваш ModelViewSet хочет id модель Booking здесь в пути, как: /booking/1123/. Вам нужно переопределить метод .retrieve() класса BookingAPIViewSet и сделать возможным поиск по другому полю, например, по электронной почте. docs. Установите точку останова в начале метода и посмотрите, какие args и kwargs он принимает.
Вернуться на верх