Возникли проблемы при настройке URL в Django для работы с именем пользователя вместо id (не удалось разрешить URL для связи с гиперссылками) - PullRequest
0 голосов
/ 09 ноября 2018

В моем коде Django у меня есть класс Profile, который в основном расширяет AbstractUser. Я хотел, чтобы в подробном представлении для этого пользователя использовалось имя пользователя вместо идентификатора пользователя, и это на самом деле работает отлично.

В моем urls.py у меня есть url(r'^profile/view/(?P<username>[\w.@+-]+)/$', ProfileDetail.as_view(), name="profile-detail"), и мой класс ProfileDetail выглядит так:

class ProfileDetail(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = ProfileSerializer
    queryset = Profile.objects.all()
    lookup_field = 'username'

сопровождается этой строкой в ​​моем сериализаторе профиля: url = serializers.HyperlinkedIdentityField(view_name='profile-detail', lookup_field='username').

Все это прекрасно работает. Проблема заключается в том, что я пытаюсь просмотреть все «свайпы» моего пользователя. Мой класс Swipe имеет отношение внешнего ключа с моим классом Profile (и related_name='swipes' в этом внешнем ключе).

Я добавил это в urls.py: url(r'^profile/view/(?P<username>[\w.@+-]+)/swipes/$', ProfileSwipesList.as_view(), name="swipe-detail"), где мой класс ProfileSwipesList выглядит так:

class ProfileSwipesList(generics.ListAPIView):
    serializer_class = SwipeSerializer

    def get_queryset(self, *args, **kwargs):
        return Swipe.objects.filter(user = Profile.objects.get(username=self.kwargs['username']))

Я проверил, что набор запросов возвращает правильную вещь, набор запросов объектов Swipe. В моем сериализаторе Swipe я попытался добавить строку, аналогичную той, которую я добавил в сериализаторе своего профиля: url = serializers.HyperlinkedIdentityField(view_name='swipe-detail').

Однако, когда я пытаюсь получить доступ к этому URL, я получаю эту ошибку:

Не удалось разрешить URL-адрес для связи с гиперссылкой, используя имя представления «swipe-detail». Возможно, вам не удалось включить связанную модель в ваш API или неправильно настроен атрибут lookup_field в этом поле.

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

1 Ответ

0 голосов
/ 09 ноября 2018

Попробуйте установить lookup_field на ProfileSwipesList и добавьте lookup_field к соответствующему HyperlinkedIdentityField.

Edit:

На основании вашего комментария вам необходимо использовать настраиваемое поле с гиперссылкой для идентификации .

class SwipeIdentityField(serializers.HyperlinkedIdentityField):
    def get_url(self, obj, view_name, request, format):
        # Unsaved objects will not yet have a valid URL.
        if hasattr(obj, 'pk') and obj.pk in (None, ''):
            return None
        url_kwargs = {
            'username': obj.user.username,
        }
        return reverse(
            view_name, kwargs=url_kwargs, request=request, format=format)


class SwipeSerializer:
    url = serializers.HyperlinkedIdentityField(view_name='swipe-detail')
...