gpt4 book ai didi

python - 创建返回过滤对象的django api View

转载 作者:行者123 更新时间:2023-12-04 14:59:34 25 4
gpt4 key购买 nike

问题描述
我是 django-rest-framework 的新手,在我看来遇到了问题。我有三个模型,即#User、#Profession 和#StudentProfessions。我需要创建一个将 user_id 作为请求参数的 api View ,并返回属于特定 user_id 的所有职业的列表。

这是我的代码

profession_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

用户模型

我使用了 django 默认模型。

student_profile_app >> 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'

student_profile_app >> views.py

from .models import StudentProfile, StudentProfession

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

在我的网址中

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:\Codes\FIP\fipEnv\lib\site-packages\rest_framework\routers.py", line 77, in urls
self._urls = self.get_urls()
File "E:\Codes\FIP\fipEnv\lib\site-packages\rest_framework\routers.py", line 338, in get_urls
urls = super().get_urls()
File "E:\Codes\FIP\fipEnv\lib\site-packages\rest_framework\routers.py", line 236, in get_urls
routes = self.get_routes(viewset)
File "E:\Codes\FIP\fipEnv\lib\site-packages\rest_framework\routers.py", line 152, in get_routes
extra_actions = viewset.get_extra_actions()
AttributeError: 'function' object has no attribute 'get_extra_actions'

最佳答案

首先 StudentProfession.student_id 的模型参数集不好(它与User 模型有关 - 它应该是 Student 模型)。

Django 休息框架使用 View 集的路由器。你需要的是serializer这将代表您的端点 api 结构和 viewset .

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

根据评论进行编辑后:

序列化类:

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)

我的一些建议:

  • READ DOCS

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

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

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

关于python - 创建返回过滤对象的django api View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67244093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com