Не удается выполнить запрос на получение, используя электронную почту в качестве первичного ключа — «подробности»: «Не найдено».

#django #django-rest-framework #django-views

Вопрос:

Я пытаюсь выполнить запрос GET в API, который возвращает соответствующую запись, но продолжает получать not found . Если я позвоню:

http://127.0.0.1:8000/bookings/booking/

Я могу ПОЛУЧИТЬ все записи, но когда я пытаюсь создать одну запись на основе первичного ключа (который является адресом электронной почты (вложенный объект) — да, я рассматривал возможность изменения этого, поскольку я читал, что это плохая практика по многим причинам). Он просто возвращает детали, которые не найдены. Другие конечные точки, где первичным ключом является идентификатор, работают просто отлично.

http://127.0.0.1:8000/bookings/booking/2customer@business2.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__')
 

Комментарии:

1. каков будет результат, если мы вызовем Customer.objects.get(pk="2customer@business2.com") ?

2. Когда я пытаюсь Customer.objects.get(pk="2customer@business2.com") в оболочке, она возвращается Customer matching query does not exist , но Customer.objects.get(pk="2customer@business2.com") возвращает правильный объект, когда я пытаюсь 127.0.0.1/users/customer/pk=2customer@business2.com , ИЛИ 127.0.0.1/users/customer/pk=2customer@business2.com она возвращается {"detail":"Not found."}

Ответ №1:

Здесь есть 2 предупреждения:

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

urllib.parse.unquote("2customer@business2.com")
 
  1. Вашему набору моделей требуется id модель бронирования здесь, в пути, например: /booking/1123/ . Вам нужно переопределить .retrieve() метод класса BookingAPIViewSet и сделать возможным поиск по другому полю, например по электронной почте. Документы. Остановите точку останова в начале метода и посмотрите, какие аргументы и параметры для этого требуются.

Комментарии:

1. Спасибо за это, я не совсем понимаю, где вы находите первое предупреждение; Я получаю закодированный URL-адрес. Я просто попробовал строку через вызов по соображениям здравомыслия. Спасибо за маршрут .retrieve (), теперь для меня это имеет смысл. Кроме того, я действительно должен использовать электронную почту в качестве ПК в первую очередь. Я проголосую за ваш ответ. Очень признателен 8^)

2. Возможно, я использовал неправильный термин «предупреждение», я думаю, что это должно звучать как «способы улучшения». Конечно, никаких предупреждений в консоли или персонале, подобных этому. Да, если вы используете декодированную кодировку URL — это то, что вам нужно. 🙌

Ответ №2:

Попробуйте получить результат запроса с помощью:

 Model.object.get(pk='2customer@business2.com') 
 

Или использовать:

 Model.object.all().get(pk='2customer@business2.com')
 

Вы также можете использовать get_object_or_404 для тестирования, импортировав его следующим образом:

 from django.shortcuts import get_object_or_404 
 

С помощью этого вы сможете отследить его. Но на основании сообщения об ошибке, которое вы получаете, оно показывает, что данные, которые вы пытаетесь получить из базы данных, не существуют, следовательно, вы получаете сообщение об ошибке «Не найдено».

Это то же самое, что использовать get_object_or_404 . Он вернет 404 (Не найден), если данных нет в вашей базе данных.

Комментарии:

1. Объект действительно существует, когда я ищу его с помощью ORM, с помощью которого я могу его найти, ...get(pk="2customer@business2.com") но когда я пробую конечную 127.0.0.1/users/customer/pk=2customer@business2.com точку ИЛИ ....pk=2customer@business2.com получаю {"detail":"Not found."}