Ссылка на идентификатор пользователя в диспетчере 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. (например, вопрос задан здесь)

Вернуться на верх