【问题标题】:Make Django-Rest-Framework API specific for the User (url/username)使 Django-Rest-Framework API 特定于用户(url/用户名)
【发布时间】:2019-06-01 15:57:37
【问题描述】:

我的 Django 后端是这样构建的:我们有学习计划,有与之相关的任务。现在我通过一个看起来像这样的 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"]

网址:

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"
}
]

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-admin


    【解决方案1】:

    首先您需要将您的 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()
    

    还有一个网址

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

    【讨论】:

    • 如果我使用foreignket我只能分配一个用户,访问学习计划的url是什么?
    • 然后使用多对多字段
    • 是的,我这样做了,但我现在无法访问 url 页面,url 会是什么?我做了学习计划/william123/
    • 您没有在 url 中传递用户。您正在使用当前用户,因此将查询集限制为 self.request.user.studieplan.all()
    • 可能需要self.request.user.studieplan_set.all(),因为它是一个M2M字段
    猜你喜欢
    • 2020-05-07
    • 2019-10-18
    • 2017-02-26
    • 2019-02-06
    • 2016-11-20
    • 2019-07-02
    • 2018-12-20
    • 2013-11-15
    • 2019-04-04
    相关资源
    最近更新 更多