【发布时间】:2019-02-14 03:18:40
【问题描述】:
这些是我的models.py
class Grade(models.Model):
grade = models.CharField(max_length=255, primary_key=True)
class Student(models.Model):
name = models.CharField(max_length=255)
grade = models.ForeignKey(grade, on_delete=models.CASCADE)
rollno = models.BigIntegerField()
我要做的是制作一个序列化程序,它使用 url:'check/{str:pk}/'为我提供所有学生到特定年级的列表(以实现获取和删除方法)。 在我的序列化器中,我试图将这两个模型组合在一起,如下所示:
class MySerializer(serializers.ModelSerializer):
allStudents = serializers.SerializerMethodField()
class Meta:
model = Grade
fields = ("grade", "allStudents")
def get_allStudents(self, obj):
s_list = []
fields = ['name', 'grade', 'rollno']
for stds in obj:
s_list.append(model_to_dict(stds, fields=fields))
return s_list
我的views.py 如下所示:
class IndividualGrade(generics.RetrieveUpdateDestroyAPIView):
'''
PUT check/{grade}/
GET check/{grade}/
DELETE check/{grade}/
'''
queryset = Grade.objects.all()
serializer_class = MySerializer
def get(self, request, *args, **kwargs):
try:
s1 = Grade.objects.get(grade=kwargs["pk"])
all_stds = Student.objects.filter(grade=s1)
a_grade = Grade.objects.get(grade=s1)
return Response(MySerializer(a_grade, all_stds ).data)
except Grade.DoesNotExist:
return Response(
data={
"message": "Grade with id: {} does not exist".format(kwargs["pk"])
},
status=status.HTTP_404_NOT_FOUND
)
def delete(self, request, *args, **kwargs):
try:
Grade.objects.get(grade=kwargs["pk"]).delete()
return Response(status=status.HTTP_204_NO_CONTENT)
except Grade.DoesNotExist:
return Response(
data={
"message": "Grade with id: {} does not exist".format(kwargs["pk"])
},
status=status.HTTP_404_NOT_FOUND
)
这给了我以下错误:
"message": "Grade with id: grade9 does not exist"
虽然条目肯定存在。因为我可以删除它,所以它不会显示添加的字段。
当涉及到不是马上的序列化程序时,我真的很天真。
仍然不确定我做错了什么。 另外,我想知道是否可以在 SerializerMethodFiled 中使用另一个序列化程序
编辑
1.更新
提出请求:http://127.0.0.1:8000/check/grade5/
JSON 输入:
{
"grade": "grade5",
"allstudents": [
{
"name": "Shub",
"grade": "grade5",
"rollno": 4
}
]
}
【问题讨论】: