Как передать параметры запроса клиенту javascript django rest api - PullRequest
0 голосов
/ 23 апреля 2019

Я работаю над приложением панели управления, в котором пользователи могут создавать членства и входить в систему на серверах, связанных с этим членством (входы не являются учетными записями пользователей django, это отдельный и независимый объект).

Я бы хотелхотел бы ограничить список имен для входа, возвращаемых клиентским API-интерфейсом jjascript rest Framework django, на основе внешнего ключа, связывающего имя входа с таблицей элементов.

Кажется, что я должен использовать параметры запроса, но я неконечно, как передать параметр запроса в javascript api.

Вот код javascript, с которым я сейчас работаю:

var auth = new coreapi.auth.SessionAuthentication({
  csrfCookieName: 'csrftoken',
  csrfHeaderName: 'X-CSRFToken'
})
var client = new coreapi.Client({auth: auth});
let action = ["login", "list"];
client.action(schema, action, params).then(function(result) {
  console.log(result);
});

Как мне передать api javascript для передачи: member_id =5 к этому запросу?

Со стороны django:

models.py (упрощенно):

class Member(models.Model):
    name = models.CharField(max_length=64)
    disk_quota = models.PositiveIntegerField(default=50000000000)

class Login(models.Model):
    member = models.ForeignKey(Member, on_delete=models.CASCADE)
    username = models.CharField(max_length=254)
    password = models.CharField(max_length=64, blank=True)

serializers.py:

class MemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = Member
        fields = '__all__'

class LoginSerializer(serializers.ModelSerializer):
    class Meta:
        model = Login
        fields = '__all__'

urls.py

router = routers.DefaultRouter()
router.register(r'member', views.ApiMemberViewSet, base_name = 'Member')
router.register(r'login', views.ApiLoginViewSet, base_name = 'Login')
urlpatterns = [
    path('api/docs/', include_docs_urls(title='Petal API service')),
    path('api/schema/', get_schema_view(title='Pastebin API')),
    path('api/', include(router.urls)),
}

views.py:

class ApiLoginViewSet(viewsets.ModelViewSet):
    serializer_class = LoginSerializer

    def get_queryset(self):
        return Login.objects.filter(member=request.query_params['member_id'])

1 Ответ

0 голосов
/ 24 апреля 2019

Ответ, похоже, заключается в использовании Вложенных маршрутизаторов DRF .

Затем ...

urls.py:

#from rest_framework import routers
from rest_framework_nested import routers

router = routers.DefaultRouter()
router.register(r'member', views.ApiMemberViewSet, base_name = 'Member')
login_router = routers.NestedSimpleRouter(router, r'member', lookup='member')
login_router.register(r'login', views.ApiLoginViewSet, base_name='Login')

urlpatterns = [
    path('api/docs/', include_docs_urls(title='Petal API service')),
    path('api/schema/', get_schema_view(title='Pastebin API')),
    path('api/', include(router.urls)),
    path('api/', include(login_router.urls)),
]

Иviews.py:

class ApiLoginViewSet(viewsets.ModelViewSet):
    serializer_class = LoginSerializer
    permission_classes = (PetalApiPermissions,)

    def get_queryset(self):
        return Login.objects.filter(member=self.kwargs['member_pk'])

И, наконец, JavaScript:

 // Build a client.
  var auth = new coreapi.auth.SessionAuthentication({
    csrfCookieName: 'csrftoken',
    csrfHeaderName: 'X-CSRFToken'
  })
  var client = new coreapi.Client({auth: auth});
  let action = ["member", "login", "list"];
  let params = { member_pk: 4 };
  client.action(schema, action, params).then(function(result) {
    console.log(result);
  });
...