【问题标题】:Doesn't Show the added field using SerializerMethodField不使用 SerializerMethodField 显示添加的字段
【发布时间】: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
        }
    ]
}

【问题讨论】:

    标签: python django


    【解决方案1】:

    我认为您在理解SerializerMethodField 是什么的同时在这里编码。你不需要传递任何额外的东西来使用SerializerMethodField 获取值。意味着,您不需要将all_stds 作为MySerializer 的参数传递。所以,你应该像这样更新你的序列化器:

    class StudentSerializer(serializers.ModelSerializer):
        class Meta:
            model = Student
            fields = ('name', 'grade', 'rollno')
    
    
    class MySerializer(serializers.ModelSerializer):
        def get_allStudents(self, obj):
            # here obj is a Grade Object
            # we can get all the students by `obj.student_set.all()` via reverse relationship
            return StudentSerializer(obj.student_set.all(), many=True).data
    

    此外,当您使用RetriveUpdateDestroyApiView 时,它会处理所有getpatchputdelete 方法。您不需要在视图中覆盖它们。因此,以下代码足以满足您的需求。

    class IndividualGrade(generics.RetrieveUpdateDestroyAPIView):
        '''
        PUT check/{grade}/
        GET check/{grade}/
        DELETE check/{grade}/
        '''
        queryset = Grade.objects.all()
        serializer_class = MySerializer
    
        # No more code is needed
    

    【讨论】:

    • 感谢有关视图的提示,当我执行此操作时,它显示 /check/grade9/ 处的 TypeError。'Grade' 对象不可迭代
    • 好吧,我犯了一个小错误,我已经更新了答案。
    • 我假设 student_set 可以替换为模型定义中所述的相关名称 f。虽然这适用于删除和获取,但不适用于放置。
    • 不会给我任何错误。它说“详细信息”:“未找到。”并且不接受put。
    • 您能分享一下服务器的有效负载和准确响应吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多