Использовать имя пользователя в качестве URL в Django Rest Framework - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь использовать имя пользователя для URL-адреса, чтобы получить доступ к сведениям о пользователе по адресу:

http://localhost: 8000 / api / users / usernamegoeshere

в моем urls.py У меня есть

from django.urls import path
from .views import UserViewSet
from django.conf.urls import url
from rest_framework.routers import DefaultRouter

urlpatterns = [
    path("users/", UserListView.as_view(), name="all-users"),
    path("users/<slug>/", UserViewSet),

]

views.py

from rest_framework import viewsets
from .serializers import UserSerializer
from django.contrib.auth.models import User

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    slug_field = 'username'

serializers.py

from rest_framework import serializers
from rest_framework.relations import HyperlinkedIdentityField
from django.contrib.auth.models import User
class UserSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
         model = User
         fields = ('url', 'username', 'email', 'id')
         slug_field = 'username'

Всякий раз, когда я пытаюсь go на страницу отдельных пользователей, я получаю эту ошибку: TypeError в / api / users / usernamegoeshere / init () принимает 1 позиционный аргумент, но 2 были даны

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 января 2020

Вы можете делать все в простом ViewSet (на самом деле, Viewset модели имеет все 4 действия - перечислить, создать, обновить, удалить). Все, что вам нужно установить - это свойство lookup_field в наборе.

При использовании ViewSet вы также должны использовать маршрутизатор. Обычно придерживайтесь SimpleRouter . Читайте на другом, но это редко, что вы хотите.

class UserViewSet(ModelViewSet):
    serializer_class = UserSerializer
    lookup_field = "username"

    def get_queryset(self):
        return User.objects.all()


user_router = SimpleRouter()
user_router.register("users", UserViewSet, basename="users")

urlpatterns = [
    # other url patterns you have
]
urlppatterns += user_router.urls

Вы можете запустить ./manage.py show_urls, чтобы увидеть маршруты, которые были созданы. Там вы должны увидеть что-то вроде ../users/<username>/.

Примечание. Хотя вы можете использовать ViewSet непосредственно при настройке URL-адресов, обычно это делать не следует. Маршрутизатор обрабатывает создание и сопоставление методов и присваивает им соответствующие имена, чтобы их можно было предсказуемо перевернуть. Он также обрабатывает сопоставление методов @action, которые вы можете добавить в ViewSet.

Если вам нужно сделать это вручную, то вам, вероятно, следует использовать вместо этого ApiView, по одному для каждого пути.

0 голосов
/ 21 января 2020

Изменить path("users/<slug>/", UserViewSet),

на path("users/<slug>/", UserViewSet.as_view()),

...