Я конвертирую из ModelSerializer
в HyperlinkedModelSerializer
, следуя этому документу (https://www.django-rest-framework.org/api-guide/relations/)
доска
# board/urls.py
app_name = 'board'
urlpatterns = [
path('boards/', BoardList.as_view(), name='board-list'),
path('boards/<int:pk>', BoardDetail.as_view(), name='board-detail'),
path('', api_root),
]
urlpatterns = format_suffix_patterns(urlpatterns)
# board/views.py
@api_view(['GET'])
def api_root(request, format=None):
return Response({
'boards': reverse('board:board-list', request=request, format=format)
})
class BoardList(generics.ListCreateAPIView):
queryset = Board.objects.all()
serializer_class = BoardSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
# author = serializers.PrimaryKeyRelatedField(
# read_only=True, default=serializers.CurrentUserDefault()
# )
author = serializers.HyperlinkedRelatedField(
read_only=True, default=serializers.CurrentUserDefault()
)
def perform_create(self, serializer):
serializer.save(author=self.request.user)
class BoardDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Board.objects.all()
serializer_class = BoardSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsAuthorOrReadOnly]
# board/serializers.py
class BoardSerializer(serializers.HyperlinkedModelSerializer):
# author = serializers.PrimaryKeyRelatedField(
# read_only=True, default=serializers.CurrentUserDefault()
# )
author = serializers.HyperlinkedRelatedField(
view_name='user-detail', read_only=True, default=serializers.CurrentUserDefault()
)
url = serializers.HyperlinkedIdentityField(view_name="board:board-detail")
class Meta:
model = Board
# fields = ('id', 'author', 'title', 'body', 'image', 'created','updated')
fields = ('url','id', 'author', 'title', 'body', 'image', 'created','updated')
пользователи
# users/serializers.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
# boards = serializers.PrimaryKeyRelatedField(
# many=True, queryset=Board.objects.all()
# )
boards = serializers.HyperlinkedRelatedField(
view_name='user-detail',
many=True,
queryset=Board.objects.all()
)
url = serializers.HyperlinkedIdentityField(view_name="users:user-detail")
class Meta:
model = User
# fields = ('id', 'username', 'boards')
fields = ('url', 'id', 'username', 'boards')
Я получил эту ошибку,
Неправильно настроен в /boards / Не удалось разрешить URL-адрес для связи с гиперссылкой, используя имя представления "board-detail" ». Возможно, вам не удалось включить связанную модель в ваш API или неправильно настроен атрибут lookup_field
в этом поле.
В соответствии с документом в разделе отношений, (https://www.django-rest-framework.org/api-guide/relations/) ,, по умолчанию lookup_field
это pk
, что мне не нужно на данный момент. Если это не так, пожалуйста, поправьте меня. Если мне нужно lookup_field
, какую переменную мне нужно передать?