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