Python 创建返回过滤对象的django api视图

Python 创建返回过滤对象的django api视图,python,django-rest-framework,Python,Django Rest Framework,问题描述 我是django rest框架的新手,在我看来有一个问题。我有三种模式,即“用户”、“专业”和“学生专业”。我需要创建一个api视图,该视图将用户id作为请求参数,并返回属于特定用户id的所有职业的列表 这是我的代码 from student_profile_app.views import getStudentProfessions from rest_framework import routers router.register('getStudentProfessions/&

问题描述
我是django rest框架的新手,在我看来有一个问题。我有三种模式,即“用户”、“专业”和“学生专业”。我需要创建一个api视图,该视图将用户id作为请求参数,并返回属于特定用户id的所有职业的列表

这是我的代码

from student_profile_app.views import getStudentProfessions
from rest_framework import routers

router.register('getStudentProfessions/<int:studentId>', getStudentProfessions, 'getStudentProfessions')

urlpatterns = router.urls
profession\u app>>models.py

from django.db import models

class Profession(models.Model):
    profession_name = models.CharField(max_length=100)

    def __str__(self):
        return self.profession_name

from django.contrib.auth.models import User
from department_app.models import Department
from profession_app.models import Profession
from program_app.models import Program
from django.db import models

class StudentProfile(models.Model):
    student_status = models.BooleanField()
    phone_number = models.CharField(max_length=100)
    year_of_study = models.CharField(max_length=100)
    program_id = models.ForeignKey(Program, on_delete=models.CASCADE)
    student_id = models.OneToOneField(User, on_delete=models.CASCADE, related_name="student_id")
    organization_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="organization_id")
    profile_image = models.ImageField(upload_to='images/', blank=True)
    field_supervisor_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="field_supervisor")
    department_id = models.ForeignKey(Department, on_delete=models.CASCADE)
    academic_supervisor_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="academic_supervisor")

    def __str__(self):
        return f'{self.student_id.username } Profile'


class StudentProfession(models.Model):
    student_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="student_profession_id")
    profession_id = models.ForeignKey(Profession, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.student_id.username } Profession' 
from .models import StudentProfile, StudentProfession

def getStudentProfessions(request, studentId):
    professions = StudentProfession.objects.filter(student_id=studentId)
    return professions
用户模型

我使用了django默认模型

学生档案应用程序>>models.py

from django.db import models

class Profession(models.Model):
    profession_name = models.CharField(max_length=100)

    def __str__(self):
        return self.profession_name

from django.contrib.auth.models import User
from department_app.models import Department
from profession_app.models import Profession
from program_app.models import Program
from django.db import models

class StudentProfile(models.Model):
    student_status = models.BooleanField()
    phone_number = models.CharField(max_length=100)
    year_of_study = models.CharField(max_length=100)
    program_id = models.ForeignKey(Program, on_delete=models.CASCADE)
    student_id = models.OneToOneField(User, on_delete=models.CASCADE, related_name="student_id")
    organization_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="organization_id")
    profile_image = models.ImageField(upload_to='images/', blank=True)
    field_supervisor_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="field_supervisor")
    department_id = models.ForeignKey(Department, on_delete=models.CASCADE)
    academic_supervisor_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="academic_supervisor")

    def __str__(self):
        return f'{self.student_id.username } Profile'


class StudentProfession(models.Model):
    student_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="student_profession_id")
    profession_id = models.ForeignKey(Profession, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.student_id.username } Profession' 
from .models import StudentProfile, StudentProfession

def getStudentProfessions(request, studentId):
    professions = StudentProfession.objects.filter(student_id=studentId)
    return professions
学生档案应用程序>>视图.py

from django.db import models

class Profession(models.Model):
    profession_name = models.CharField(max_length=100)

    def __str__(self):
        return self.profession_name

from django.contrib.auth.models import User
from department_app.models import Department
from profession_app.models import Profession
from program_app.models import Program
from django.db import models

class StudentProfile(models.Model):
    student_status = models.BooleanField()
    phone_number = models.CharField(max_length=100)
    year_of_study = models.CharField(max_length=100)
    program_id = models.ForeignKey(Program, on_delete=models.CASCADE)
    student_id = models.OneToOneField(User, on_delete=models.CASCADE, related_name="student_id")
    organization_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="organization_id")
    profile_image = models.ImageField(upload_to='images/', blank=True)
    field_supervisor_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="field_supervisor")
    department_id = models.ForeignKey(Department, on_delete=models.CASCADE)
    academic_supervisor_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="academic_supervisor")

    def __str__(self):
        return f'{self.student_id.username } Profile'


class StudentProfession(models.Model):
    student_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="student_profession_id")
    profession_id = models.ForeignKey(Profession, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.student_id.username } Profession' 
from .models import StudentProfile, StudentProfession

def getStudentProfessions(request, studentId):
    professions = StudentProfession.objects.filter(student_id=studentId)
    return professions
和在我的URL中

from student_profile_app.views import getStudentProfessions
from rest_framework import routers

router.register('getStudentProfessions/<int:studentId>', getStudentProfessions, 'getStudentProfessions')

urlpatterns = router.urls
首先,StudentProfession.student_id的模型参数设置不正确(它与用户模型相关-应该是学生模型)

Django rest框架对路由器使用viewset。 您需要的是,它将表示您的端点api结构和

我将为您编写简单的序列化程序和视图集,但您确实需要阅读文档

编辑评论后:

序列化程序类:

from rest_framework import serializers
#...other imports

class StudentProfessionSerializer(serializers.ModelSerializer):
    class Meta:
        model = StuedentProfession
        fields = ('profession')
Viewset类(这就是您在路由器中注册的内容!)

我的一些建议:

  • 您不需要在ForeignKey字段中写入“_id”后缀(django使其自动处于隐藏状态-意味着表中的列无论如何都将具有_id后缀),然后您就可以使用没有这个丑陋的_id的参数。。。像这样

     StudentProfession.objects.filter(student=somestudentid)
    
  • 您的API应该像

     router.register(r'students/(?P<studentId>\d+)/professions', StudentProfessionViewSet, 'student-profession')
    
    router.register(r'students/(?P\d+)/professions',studentprofessionview集,'student profession')
    
  • 尽量不要在url中使用对象的“真实”ID—而是使用UUID—这样更安全


我按照您回答中的说明做了,现在错误出现在url模式中,请求url:。刚刚尝试检索id为15的学生的所有职业。导致此错误的原因可能是什么?它说**找不到页面**您是否在主项目url.py文件中添加了路由器url模式?是的,除此之外,其他url模式运行良好。Hmmm,尝试使用“localhost:8000/api/students/15/professions/”(在url末尾添加斜线)