首页 > 解决方案 > 尝试在嵌套序列化程序中创建多个对象

问题描述

我有以下型号:

class Grade(models.Model):
    grade = models.CharField(max_length=255, unique=True)
class Student(models.Model):
    class Meta:
        unique_together = ("rollno", "grade")

    name = models.CharField(max_length=255) 
    grade = models.ForeignKey(Grade,related_name='StudentList', on_delete=models.CASCADE)
    rollno = models.BigIntegerField(unique = True)

class GradeTotal(models.Model):
    grade = models.ForeignKey(Grade, related_name='GradeMarks', on_delete=models.CASCADE)
    average = models.IntegerField()
    total = models.IntegerField()

class StudentTotal(models.Model):
    rollno = models.ForeignKey(Student, related_name='StudentMarks', on_delete=models.CASCADE)
    gradeno = models.ForeignKey(GradeTotal, related_name='Fromgrade', on_delete=models.CASCADE)
    marks = models.IntegerField()

我正在使用模型Grade来创建GradeTotal,然后StudentTotal. 只有当外键和被用于进程的瞬间相同时,才会StudentTotal创建对象。gradeGradeTotalStudentGrade

为此,我有以下序列化程序:

class StudentDataSerializer(serializers.ModelSerializer):
    rollno = serializers.CharField()
    class Meta:
        model =StudentTotal
        fields = ('marks', 'rollno' )

class GradeSerializer(serializers.ModelSerializer):
    Fromgrade = StudentDataSerializer(many=True)
    class Meta:
        model = GradeTotal
        fields = ('average', 'total', 'Fromgrade', )

class MultipleGradeSerializer(serializers.ModelSerializer):
    GradeMarks = GradeSerializer(many=True)
    grade = serializers.CharField()
    class Meta:
        model = Grade
        fields = ("grade", "GradeMarks")

    def update(self, instance, validated_data):
        g_data = validated_data.pop('GradeMarks')
        for datas in g_data:
            a1 = datas["average"]
            t1 = datas["total"]
            g1 = GradeTotal.objects.create(grade=instance, average=a1, total=t1)
            data2 = datas.pop('Fromgrade')
            for data in data2:
                e1 = data["rollno"]
                r1 = Student.objects.get(rollno=data["rollno"])
                if s1.grade == instance:
                    StudentTotal.create(gradeno = g1, rollno = r1, marks =data["marks"])
        return instance

这是我能想到的最好方法,但使用以下 JSON 有效负载:

{
    "grade": "nine",
    "GradeMarks": [
        {
            "average": 10,
            "total": 5,
            "Fromgrade": [
                {
                    "marks": 30,
                    "rollno": "N1 "
                }
            ]
        }
    ]
}

我收到以下错误:Student matching query does not exist但我可以rollno使用 django admin 看到带有 N1 的对象。我不确定为什么会这样。因此我不能创建一个对象,StudentTotal但可以创建GradeTotal.

在我看来,我将Grade其用作模型和MultipleGradeSerializer序列化程序。任何帮助将不胜感激。

附加信息 如果我执行以下调试

r1 = Student.objects.get(rollno="N1"),我没有收到此错误,不知道为什么,但我收到以下错误:

type object 'StudentTotal' has no attribute 'create'.

我已经在第二期看到了这一点,我的观点已经有了mixins.CreateModelMixin。此外,它创建了对象GradeTotal 任何人都可以清除这两个点吗?

标签: pythondjango

解决方案


这一行:

StudentTotal.create(gradeno = g1, rollno = r1, marks =data["marks"])

应该:

StudentTotal.objects.create(gradeno = g1, rollno = r1, marks =data["marks"])

推荐阅读