@Lepilov

DRF: как правильно добавить поле HyperlinkedRelatedField в сериализатор?

Я хочу сделать возможным в json который отдает все экземпляры модели переходить на конкретный экземпляр использую дополнительное поле url в сериализаторе.
есть вьюха для отображения списка

class DocumentsListView(viewsets.ViewSetMixin, generics.ListCreateAPIView):
    user = serializers.PrimaryKeyRelatedField(read_only=True,)
    queryset = Documents.objects.all()
    serializer_class = DocumentsSerializer
    permission_classes = []

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)


urls.py

router = DefaultRouter()
router.register('', DocumentsListView)

urlpatterns = [
    url('', include(router.urls), name='files')
]


Теперь я добавляю в serializer.py поле url
class DocumentsSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedRelatedField(view_name='document-detail')

    class Meta:
        model = Documents
        fields = ('id',  'filename', 'datafile', 'type', 'created', 'url')


это поле требует аргумента view_name

я добавляю во вьюху вывод экземпляра

class DocumentDetailView(viewsets.ViewSetMixin, generics.RetrieveAPIView):

    queryset = Documents.objects.all()
    serializer_class = DocumentsSerializer
    permission_classes = []


и в url добавил
router.register('', DocumentDetailView, 'document-detail')


Получаю
AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`.


Если ставлю read_only=`True`, то ошибок нет но и url не отображается.

Может я вообще неправильно реализую? Нужен ли мне вообще DocumentDetailView ?
  • Вопрос задан
  • 453 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы