Возможно ли передать id внешнего ключа в URL Django rest-framework?
Я использую маршрутизаторы в Django Rest Framework и пытаюсь создать динамический URL на основе внешнего ключа. Мой urls.py файл выглядит следующим образом,
router = routers.DefaultRouter()
router.register('user/<int:user_id>/profile',
IntensityClassViewSet, 'intensity_classes')
urlpatterns = router.urls
Мой models.py файл выглядит следующим образом,
class Profile(models.Model):
user = models.ForeignKey(
User, related_name='profile_user', on_delete=models.CASCADE)
character = models.CharField(max_length=10, null=True, blank=True)
Мой views.py файл выглядит следующим образом,
class ProfileViewSet(viewsets.ModelViewSet):
queryset = Profile.objects.all()
serializer_class = ProfileSerializer
Я получаю ошибку 404 во всех запросах (post, put, get). Есть ли какое-нибудь простое решение для такого рода реализации?
Вот как я решаю ту же проблему
views.py
from rest_framework import mixins
from rest_framework.generics import GenericAPIView
class RetrieveUpdateDeleteProfile(
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
GenericAPIView
):
lookup_field = 'id'
serializer_class = ProfileSerializer
queryset = Profile.objects.all()
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
urls.py
from django.urls import path
from .views import RetrieveUpdateDeleteProfile
urlpatterns = [
path('profile/<int:id>/', RetrieveUpdateDeleteProfile.as_view(), name='profile_rud'),
]
Таким образом, вы можете получать, обновлять и удалять (GET, POST, PUT, DELETE) профиль obj с помощью одной конечной точки API
После изменения URL в формате regex моя проблема была решена. Вместо этого,
router.register('user/<int:user_id>/profile', ProfileViewSet, 'profile')
Я написал это,
router.register(r'user/(?P<user_id>\d+)/profile', ProfileViewSet, 'profile')