#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 предупреждения:
- Ваша поисковая фраза закодирована по URL-адресу, вы можете увидеть что-то подобное
@
во фразе.
import urllib
urllib.parse.unquote("2customer@business2.com")
- Вашему набору моделей требуется
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."}