使用django_restframework从数据库获取并返回一个字段
因此,我一直在尝试使用Django rest_框架制作一个API,该API只会从表中返回1个字段。我一直试图从中学习这个示例,但无法重新创建它。每当我写信的时候”http://localhost:8000/api/students/fields=id/,我得到一个带有“详细信息”的404错误:“未找到” 我还尝试在view类中添加一个额外的方法,如本例所示:使用django_restframework从数据库获取并返回一个字段,django,api,django-rest-framework,Django,Api,Django Rest Framework,因此,我一直在尝试使用Django rest_框架制作一个API,该API只会从表中返回1个字段。我一直试图从中学习这个示例,但无法重新创建它。每当我写信的时候”http://localhost:8000/api/students/fields=id/,我得到一个带有“详细信息”的404错误:“未找到” 我还尝试在view类中添加一个额外的方法,如本例所示: @action(methods=['get'], detail=False) def newest(self, request):
@action(methods=['get'], detail=False)
def newest(self, request):
newest = self.get_queryset().order_by('created_at').last()
serializer = self.get_serializer_class()(newest)
return Response(serializer.data)
用“获取id列表”之类的东西代替,但我还没有完全弄明白
还有,是否有人知道这些方法将首先从数据库中检索所有字段,然后过滤掉它需要的内容,或者查询将调整为只要求指定的字段?这些表可能会变得相当大,因此如果不获取不必要的数据,可能会节省大量时间
下面是serializer.py中的代码
from rest_framework.serializers import ModelSerializer
from .models import Student, Coverage
class DynamicFieldsModelSerializer(ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed.
"""
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop('fields', None)
# Instantiate the superclass normally
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)
class StudentSerializer(DynamicFieldsModelSerializer, ModelSerializer):
class Meta:
model = Student
fields = ['id', 'name', 'course', 'rating']
models.py
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=140)
course = models.CharField(max_length=140)
rating = models.IntegerField()
class Meta:
ordering = ['name']
views.py
from rest_framework.viewsets import ModelViewSet, ViewSet
from rest_framework.response import Response
from rest_framework.decorators import action
from .models import Student, Coverage
from .serializers import StudentSerializer, CoverageSerializer, CoverageNrSerializer
import logging
logger = logging.getLogger(__name__)
class StudentsViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer