Метод POST не разрешен [DRF]
Это моя модель пользователя
class User(AbstractBaseUser, PermissionsMixin, Base):
user_id = models.AutoField(primary_key=True)
email = models.EmailField(db_index=True, max_length=100, unique=True)
is_advisor = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
А это мой UserProfile
class UserProfile(Base):
profile_id = models.AutoField(primary_key=True)
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user_profile')
first_name = models.CharField(null=True, blank=True, max_length=100)
last_name = models.CharField(null=True, blank=True, max_length=100)
Это мой UserProfileSerializer
class UserProfileSerializer:
class Meta:
model = UserProfile
fields = "__all__"
И это мое мнение
class UserProfileViewSet(viewsets.ModelViewSet):
queryset = UserProfile.objects.all()
parser_classes = (MultiPartParser, )
serializer_class = UserProfileSerializer
lookup_field = 'user'
Это моя urls.py
router = SimpleRouter(trailing_slash=False)
router.register(r'user', UserViewSet)
router.register(r'user/profile', UserProfileViewSet)
urlpatterns = [
path(r'user/activate', ActivateUser.as_view(), name='activate_user'),
] + router.urls
Когда я пытаюсь создать пользователя, используя url http://localhost:8000/api/user/profile/2
я получаю подробную информацию : Метод POST не разрешен
Что я делаю неправильно? Любая помощь будет принята с благодарностью.
Я вижу довольно много мелких ошибок для начинающих. Я рекомендую вам делать меньшие шаги и убедиться, что каждая часть работает по мере продвижения вперед.
Убедитесь, что ваша модель пользователя установлена в настройках как AUTH_USER_MODEL и проверьте, что вы можете создать и увидеть хотя бы одного пользователя в оболочке, прежде чем беспокоиться о сериализации DRF и т.д.
Тогда, поскольку у вас есть пользовательская модель пользователя, маловероятно, что вам понадобится объект UserProfile - он обычно существует для расширения существующей модели пользователя, а поскольку у вас есть своя модель, вы можете просто расширить ее, чтобы все было как можно проще.
Установите нужные вам поля пользователя и поэкспериментируйте с созданием пользователей в оболочке. Оболочка django - это отличный инструмент для разработки и обучения.
После того, как вы сможете создавать пользователей в оболочке и перечислять их (например, с помощью User.objects.all()), вы можете перейти к добавлению сериализатора. Он должен унаследовать некоторое поведение от подходящего сериализатора DRF по умолчанию. Добавьте его к вашим урлам и протестируйте его, используя DRF api (вам понадобится 'rest_framework' в ваших настройках).
Вы можете проверить свой сериализатор и в оболочке, но DRF api тестер очень удобен, когда вы только начинаете, поэтому вы можете сразу добавить url и использовать его. Вы сможете посмотреть и опубликовать свои изменения. Поле lookup_field не является необходимым.
При добавлении урлов для моделей не используйте слеши для разбиения имени модели. Косые черты указывают на отдельные части, а имя модели является единственной значимой частью url. Вы можете использовать подчеркивание, если хотите разделить имя (например, "api/user_profile/").
Оставляйте косые черты в DRF, если у вас нет очень веской причины их не ставить. Django автоматически добавит их как часть обработки ошибок, если вы забудете их ввести.
Надеюсь, этого будет достаточно для того, чтобы вы смогли выбраться из тупика.
При ModelViewSets
, api/user/profile/2
соответствует представлению detail. Это подразумевает, что объект уже должен существовать.
Поскольку для пользователя 2 еще нет профиля (а вы хотели его создать), вы получаете ошибку 404/not found.
Есть несколько способов решить эту проблему, но для поддержки создания профиля для пользователя без изменений в вашем текущем коде, вы можете просто отправить сообщение на /api/user/profile
с идентификатором пользователя в данных запроса таким образом:
ПОСТ: http://localhost:8000/api/user/profile
{
"user": 2,
"first_name": "Tannisha",
"last_name": "Hill"
}
urlpatterns = [ path('', include(router.urls)), ...... ]