Сделайте Django-Rest-Framework API специфичным для пользователя (url / username) - PullRequest
0 голосов
/ 01 июня 2019

Мой Django Backend построен следующим образом: у нас есть Studyplans, с которыми связаны задачи.Прямо сейчас я получаю учебные планы через URL-адрес, который выглядит примерно так: 'url: 8000 / database / studyplans'.

Я хочу, чтобы учебные планы были подключены к пользователю, к которому вы подключились.Таким образом, URL будет выглядеть примерно так: 'url: 8000 / database / studyplans / WilliamABC' или какой-то другой пользователь: 'url: 8000 / database / studyplans / Bruce123'

Модели:

from django.db import models
from datetime import date

#Create your models here.
class StudyplanTask(models.Model):
title = models.CharField(max_length=150)
description = models.CharField(max_length=1000, blank=True)
state = models.CharField(max_length=20)
doneby = models.DateField(default=date.today)

class Meta:
    verbose_name_plural = 'Tasks'

def __str__(self):
    return self.title

class StudiePlan(models.Model):
title = models.CharField(max_length=150)
description = models.CharField(max_length=1000)
tasks = models.ManyToManyField(StudyplanTask, blank=True)
doneby = models.DateField(default=date.today)

class Meta:
    verbose_name_plural = 'Studyplans'

def __str__(self):
    return self.title

Сериализаторы:

from rest_framework import serializers
from .models import StudiePlan, StudyplanTask

class StudyplanTaskSerializer(serializers.ModelSerializer):
class Meta:
    model = StudyplanTask
    fields = ('id', 'title', 'description', 'state', 'doneby')

class StudyplanTaskNameSerializer(serializers.ModelSerializer):
class Meta:
    model = StudyplanTask
    fields = ('id', 'title', 'description', 'state', 'doneby')

class StudyplanSerializer(serializers.ModelSerializer):
tasks = StudyplanTaskNameSerializer(many=True, read_only=True)
class Meta:
    model = StudiePlan
    fields = ('id', 'title', 'description', 'tasks', 'doneby')

Просмотры:

from django.shortcuts import render 
from rest_framework import viewsets, permissions
from .models import StudiePlan, StudyplanTask
from .serializers import StudyplanSerializer, StudyplanTaskSerializer

# Create your views here.
class StudyplanView(viewsets.ModelViewSet):
http_method_names = ['get', 'post', 'put', 'delete', 'patch']
queryset = StudiePlan.objects.all()
serializer_class = StudyplanSerializer

#get
def get(self, request):
    hello_param = request.GET["helloParam"]
#post
def post(self, request):
    hello_param = request.POST["helloParam"]
#put
def put(self, request):
    hello_param = request.PUT["helloParam"]
#patch
def patch(self, request):
    hello_param = request.PATCH["helloParam"]
#delete
def delete(self, request):
    hello_param = request.DELETE["helloParam"]

class StudyplanTaskView(viewsets.ModelViewSet):
http_method_names = ['get', 'post', 'put', 'delete', 'patch']
queryset = StudyplanTask.objects.all()
serializer_class = StudyplanTaskSerializer

#get
def get(self, request):
    hello_param = request.GET["helloParam"]
#post
def post(self, request):
    hello_param = request.POST["helloParam"]
#put
def put(self, request):
    hello_param = request.PUT["helloParam"]
#patch
def patch(self, request):
    hello_param = request.PATCH["helloParam"]
#delete
def delete(self, request):
    hello_param = request.DELETE["helloParam"]

URL:

from django.urls import path, include
from . import views
from rest_framework import routers

router = routers.DefaultRouter()
router.register('studyplans/', views.StudyplanView)
router.register('studyplan-tasks/', views.StudyplanTaskView)

urlpatterns = [
path('', include(router.urls)),
]

API:

[
{
    "id": 1,
    "title": "Learn to Build a Mobile Frontend",
    "description": "en opresesntion som är bra dokumenterad en opresesntion som är bra dokumenterad en opresesntion som är bra dokumenterad en opresesntion som är bra dokumenterad",
    "tasks": [
        {
            "id": 1,
            "title": "Learn Python",
            "description": "en opresesntion som är bra dokumenterad en opresesntion som är bra dokumenterad en opresesntion som är bra dokumenterad en opresesntion som är bra dokumenterad",
            "state": "active",
            "doneby": "2019-05-31"
        }
    ],
    "doneby": "2019-05-31"
}
]

1 Ответ

0 голосов
/ 01 июня 2019

Сначала вам нужно связать свой StudiePlan с пользователем

class StudiePlan(models.Model):
    title = models.CharField(max_length=150)
    description = models.CharField(max_length=1000)
    tasks = models.ManyToManyField(StudyplanTask, blank=True)
    doneby = models.DateField(default=date.today)
    user = models.ForeginKey(User, on_delete=models.CASCADE)

Затем создать представление

class UserStudyplanView(StudyplanView):
    def get_queryset(self):
        return self.request.user.studieplan.all()

И URL

router.register('user-studyplan-tasks/', views.UserStudieplanView)
...