正在创建返回筛选对象的django-api视图



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

这是我的代码

professional_app>gt;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

用户模型

我使用了django默认模型。

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


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' 

学生档案应用程序>gt;views.py

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

但是当我运行服务器时,我得到了以下错误

urlpatterns = router.urls
File "E:CodesFIPfipEnvlibsite-packagesrest_frameworkrouters.py", line 77, in urls
self._urls = self.get_urls()
File "E:CodesFIPfipEnvlibsite-packagesrest_frameworkrouters.py", line 338, in get_urls
urls = super().get_urls()
File "E:CodesFIPfipEnvlibsite-packagesrest_frameworkrouters.py", line 236, in get_urls
routes = self.get_routes(viewset)
File "E:CodesFIPfipEnvlibsite-packagesrest_frameworkrouters.py", line 152, in get_routes
extra_actions = viewset.get_extra_actions()
AttributeError: 'function' object has no attribute 'get_extra_actions'

首先StudentProfession.student_id有一个坏的模型参数集(它与用户模型有关-它应该是学生模型(。

Django rest框架将视图集用于路由器。您需要的是表示端点api结构和视图集的序列化程序。

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

从评论编辑后:

序列化程序类:

from rest_framework import serializers
#...other imports
class StudentProfessionSerializer(serializers.ModelSerializer):
class Meta:
model = StuedentProfession
fields = ('profession')

Viewset类(这就是你在路由器中注册的!(

from rest_framework import viewsets, mixins
#...other imports
class StudentProfessionViewSet(viewsets.GenericViewSet,
mixins.ListModelMixin,
mixins.RetrieveModelMixin):
serializer_class = StudentProfessionSerializer
queryset = StudentProfession.objects
def get_queryset(self):
student_id = self.kwargs.get('studentId')
return self.queryset.filter(student_id=student_id)

我的一些提示:

  • 阅读文档

  • 你不需要写"_id";ForeignKey字段中的后缀(django使其自动隐藏-意味着表中的列无论如何都会有_id后缀(,然后您可以使用没有这个丑陋_id的params。。。像这个

    StudentProfession.objects.filter(student=somestudentid)
    
  • 你的API应该像一样构建

    router.register(r'students/(?P<studentId>d+)/professions', StudentProfessionViewSet, 'student-profession')
    
  • 尽量不要使用";真实的";url中对象的ID-使用UUID-它更安全的

最新更新