Не удалось определить URL для гиперссылочных отношений с помощью Django REST Framework
Я создаю проект на Django Rest Framework для взаимодействия с моим приложением React, позволяющим пользователям регистрироваться и создавать профиль.
Однако, когда я запускаю python manage.py runserver
и нажимаю на url, появляющийся на корневой странице API, я получаю следующее сообщение об ошибке:
ImproperlyConfigured at /profiles/
Could not resolve URL for hyperlinked relationship using view name "user-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.
Вот мой код models.py:
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=100, blank=True)
location = models.CharField(max_length=100, blank=True)
email = models.EmailField(max_length=150)
signup_confirmation = models.BooleanField(default=False)
def __str__(self):
return self.user.username
@receiver(post_save, sender=User)
def update_profile_signal(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()
Мой serializers.py:
from rest_framework import serializers
from .models import Profile
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Profile
fields = ('user', 'name', 'location', 'email', 'signup_confirmation')
urls.py:
from django.urls import path, include
from rest_framework import routers
from .import views
router = routers.DefaultRouter()
router.register(r'profiles', views.ProfileViewSet)
urlpatterns = [
path('', include(router.urls)),
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
и views.py
from rest_framework import viewsets
from .serializers import ProfileSerializer
from .models import Profile
from .forms import SignUpForm
from .tokens import account_activation_token
class ProfileViewSet(viewsets.ModelViewSet):
queryset = Profile.objects.all().order_by('name')
serializer_class = ProfileSerializer
Есть идеи, почему я получаю эту ошибку
Вы наследуете HyperlinkedModelSerializer
в ProfileSerializer
, а ProfileSerializer
имеет поле user
, настроенное внутри Meta
. Это означает, что он должен искать обратный URL представления user-detail
(с некоторым аргументом pk
). Но у вас нет представления, связанного с этим именем представления, поэтому вы получаете ImproperlyConfigured
Upd:
Самым простым исправлением будет наследование от ModelSerializer
вместо HyperlinkedModelSerializer
. Различия заключаются в
HyperlinkedModelSerializer
по умолчанию не включает полеid
HyperlinkedModelSerializer
включает полеurl
, которое указывает на url сериализованного экземпляра- Взаимоотношения используют
HyperlinkedRelatedField
, вместоPrimaryKeyRelatedField
.
Основной причиной перехода на ModelSerializer
является то, что вам не нужно настраивать имена представлений (например, создавать наборы представлений) для каждой связанной модели.
Вы также можете прочитать docs для более подробной информации