Django Rest Framework Динамический URL Маршрут - PullRequest
0 голосов
/ 27 сентября 2019

В настоящее время я делаю небольшой проект в Django (2.2.5) и djangorestframework (3.10.3).У меня проблема с подключением вида к роутеру.Я был бы очень признателен за вторую пару глаз, чтобы помочь мне попытаться выяснить, что не так

Для URL я попробовал следующее 2:

router = routers.DefaultRouter()
router.register(r'<chatroom>', views.ChatRoomViewSet)
router.register(r'<str:chatroom>', views.ChatRoomViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls',namespace='rest_framework')),
    path('admin/', admin.site.urls),
]

, а затем добавил маршрутизаторto urlpatterns.

Вид:

class ChatRoomViewSet(viewsets.ModelViewSet):

    queryset = ChatRoom.objects.all().order_by('name')
    serializer_class = ChatRoomSerializer
    lookup_field = 'name'

    def get_viewset(self, request, name=None):
        name = self.kwargs.get('name', None)
        queryset = ChatRoom.objects.filter(name=name)
        return queryset

И сериализатор

class ChatRoomSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = ChatRoom
        fields = ['url', 'name']
        lookup_field = 'name'

Модель:

class ChatRoom(models.Model):
    name = models.CharField(max_length=255, default="")

    def __str__(self):
        return self.name

Естьчто-то я явно пропустил?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2019

Есть кое-что, что я хочу упомянуть сначала, чтобы вы могли взглянуть:

  • Похоже, вы зарегистрировали 1 путь с 1 просмотром дважды (Это выиграло 'не вызывает у вас проблемы, но просто хочу упомянуть)

  • Вы назвали свои pathparams chatroom, но вместо этого вы используете name

  • get_viewset кажется неправильным, чтобы переопределить набор запросов по умолчанию, вы должны использовать метод get_queryset вместо

  • Если вы уже используете имя параметра в списке параметров, например, def get_viewset(self, request, name=None):, чтобывам больше не нужно использовать self.kwargs, чтобы получить его, Python уже справился с этим, поэтому просто используйте name внутри функции

В конце концов, код должен выглядеть такэто,

URLs

router = routers.DefaultRouter()
router.register(r'(?P<chatroom>.*)', views.ChatRoomViewSet)

Viewset

class ChatRoomViewSet(viewsets.ModelViewSet):

    queryset = ChatRoom.objects.all().order_by('name')
    serializer_class = ChatRoomSerializer
    lookup_field = 'pk' # This will use to get the specific ChatRoom, you can remove it also

    def get_queryset(self, chatroom=None):
        # if you want request, you could use request = self.request
        # chatroom is the name you named on your path (<chatroom>)
        queryset = ChatRoom.objects.filter(name=chatroom)
        return queryset

Надеюсь, что это может помочь вам решить вашу проблему!

0 голосов
/ 27 сентября 2019

вам нужно добавить URL-адреса маршрутизатора в urlpatterns

urlpatterns = router.urls

, если URL-адреса уже объявлены, а затем объединить этот список со списком router.urls

urlpatterns += router.urls
...