Hyperlink RelatedField DRF не работает с набором представлений

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

У меня есть эти модели:

 class ExamSheet (models.Model):
    pass

class Exam(models.Model):
    exam_sheet = models.ForeignKey('myapp.ExamSheet',
                               related_name='exams',
                               )
  

Сериализатор:

 class ExamBaseSerializer(serializers.ModelSerializer):
    exam_sheet = serializers.HyperlinkedRelatedField(queryset=ExamSheet.objects.all(), view_name='examsheet-detail')

    class Meta:
        model = Exam
        fields = ('id', 'user', 'exam_sheet', )
        read_only_fields = ('id', 'user',)
  

Наборы представлений:

 class ExamViewSet(MultiSerializerViewSet):
    queryset = Exam.objects.all()

class ExamSheetViewSet(MultiSerializerViewSet):
    queryset = ExamSheet.objects.all()
  

Маршруты:

 app_name = 'exams_api'
router = DefaultRouter()
router.register(r'exams', views.ExamViewSet)
router.register(r'exams_sheets', views.ExamSheetViewSet)
urlpatterns = []
urlpatterns  = router.urls
  

Глобальные URL-адреса приложений:

 urlpatterns = [
    path('api/', include('exams_api.urls')),
]
  

GenericViewSet:

 class MultiSerializerViewSet(viewsets.ModelViewSet):
    serializers = {
        'default': None,
    }

    def get_serializer_class(self):
        return self.serializers.get(self.action, self.serializers['default'])
  

Но это выдает мне ошибку:

Неправильно сконфигурировано в /api /exams/

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

Как я могу использовать HyperlinkedRelatedField , чтобы показать ссылку на связанную модель в моем сериализаторе?

Комментарии:

1. Из документации: » Имя представления, которое следует использовать в качестве цели отношения. Если вы используете стандартные классы маршрутизатора, это будет строка в формате <имямодели>-detail. » Есть ли у вас представление для получения подробной информации об экзаменационной таблице, подключенное через маршрутизатор?

2. @Ozgur Akcali обновил мой вопрос, добавил наборы представлений и маршруты, подключенные к этим моделям-сериализаторам

3. MultiSerializerViewSet — это пользовательский набор представлений, я полагаю? Можете ли вы также опубликовать его определение?

4. @Ozgur Akcali опубликовал, но определенно здесь это не проблема.

5. Я не вижу, что не так с этой настройкой. В чем я не уверен, так это в том, что если вы опубликовали фактический код для модели ExamSheet, что django делает для модели без поля, создавая таблицу только с id? Еще одна вещь, которая приходит на ум, это то, добавили ли вы свой маршрутизатор в свои urlpatterns, такие как url(r ‘^’, include(router.urls)),? Если нет, это также может быть причиной проблемы, но помимо этого, мне кажется, что все в порядке

Ответ №1:

  1. View_name, которое вы задаете для поля гиперссылки view_name='examsheet-detail , есть ли у вас представление с именем examsheet-detail в вашем urlconf (в основном urls.py ) для этого приложения? Если нет, то после include(views.someview) добавьте ,name='examsheet-detail' в качестве третьего параметра в path.
  2. Установили ли вы app_name в urlsconf конкретного приложения? Удаление этого решило проблему для меня.
  3. Убедитесь, что <int:pk> в URL-пути для этого представления, а не <int:id> или что-то еще. В противном случае установите lookup_field='id' , потому что по умолчанию используется значение pk.
  4. Убедитесь, что view принимает параметр pk.