Ссылка на идентификатор пользователя в диспетчере URL Django
Я пытаюсь реализовать функцию поиска, в которой пользователь может найти электронное письмо на фронтенде React, и он вернет 5 лучших языков любви этого письма. В настоящее время путь к url требует первичного ключа модели языка любви, но я хочу, чтобы он использовал id пользователя. У меня есть этот Django URL, заданный как:
path('love-languages/', LovesView.as_view(), name='love-languages'),
path('love-languages/<int:pk>', LoveView.as_view(), name='love-languages')
Релевантная модель языка любви:
class Love(models.Model):
# Obtaining the user from the user model
user = models.ForeignKey(
get_user_model(),
on_delete = models.CASCADE
)
# Defining the dropdown choices
class LoveLanguages(models.TextChoices):
ACTS_OF_SERVICE = 'Acts of Service'
RECEIVING_GIFTS = 'Receiving Gifts'
QUALITY_TIME = 'Quality Time'
WORDS_OF_AFFIRMATION = 'Words of Affirmation'
PHYSICAL_TOUCH = 'Physical Touch'
one = models.CharField(max_length=20, choices=LoveLanguages.choices)
two = models.CharField(max_length=20, choices=LoveLanguages.choices)
three = models.CharField(max_length=20, choices=LoveLanguages.choices)
four = models.CharField(max_length=20, choices=LoveLanguages.choices)
five = models.CharField(max_length=20, choices=LoveLanguages.choices)
и взгляды на язык любви:
class LovesView(APIView):
def get(self, request):
loves = Love.objects.filter(user=request.user.id)
data = LoveSerializer(loves, many=True).data
return Response(data)
def post(self, request):
request.data['user'] = request.user.id
love = LoveSerializer(data=request.data)
if love.is_valid():
love.save()
return Response(love.data, status=status.HTTP_201_CREATED)
else:
return Response(love.errors, status=status.HTTP_400_BAD_REQUEST)
class LoveView(APIView):
def get(self, request, pk):
love = get_object_or_404(Love, pk=pk)
# if request.user != love.user:
# raise PermissionDenied('Unauthorized, you are not signed in as this user')
# else:
data = LoveSerializer(love).data
return Response(data)
def delete(self, request, pk):
love = get_object_or_404(Love, pk=pk)
if request.user != love.user:
raise PermissionDenied('Unauthorized, you are not signed in as this user')
else:
love.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
def put(self, request, pk):
love = get_object_or_404(Love, pk=pk)
if request.user != love.owner:
raise PermissionDenied('Unauthorized, you are not signed in as this user')
else:
updated_love = LoveSerializer(love, data=request.data)
if updated_love.is_valid():
updated_love.save()
return Response(updated_love.data)
else:
return Response(love.errors, status=status.HTTP_400_BAD_REQUEST)
Итак, если бы это были возвращаемые данные:
{
"id": 4,
"user": 2,
"one": "Acts of Service",
"two": "Receiving Gifts",
"three": "Quality Time",
"four": "Words of Affirmation",
"five": "Physical Touch"
}
URL должен быть .../love-languages/4. Я хочу, чтобы URL был .../love-languages/2, потому что я не уверен, как я могу получить доступ к пк из 4, если введен только email. Я думал о ссылке на модель языков любви в модели пользователя, но я думаю, что должен быть способ заменить <int:pk> в URL на что-то вроде <int:user>? Я попробовал это и это не сработало, я получил ошибку, говорящую TypeError: get() got an unexpected keyword argument 'user' Я читал документацию django для диспетчера URL, но не смог найти ничего полезного на данный момент.
Я также попробовал изменить запрос get в представлениях на
love = get_object_or_404(Love, pk=request.user.id)
но это не сработало. Он возвращает одни и те же данные независимо от того, какой id введен в url.
Если я правильно понял вопрос, вот что вам нужно сделать.
Django позволяет вам запрашивать модель и ее отношения с __.
Итак, чтобы сделать запрос к модели Love относительно пользователя, вы должны сделать что-то вроде этого.
try:
love = Love.objects.get(user__email=variable_email)
except Love.DoesNotExist:
raise Http404
Существует 2 способа обнаружения электронной почты в url.
Вы можете просто использовать <str:variable_email> и затем очистить email в представлении, прежде чем использовать его для запроса к базе данных.
Или вы можете использовать regex для определения шаблона в url. (например, вопрос задан здесь)