【问题标题】:Querying Multiple foreign key relationships in DRF查询 DRF 中的多个外键关系
【发布时间】:2021-11-30 06:15:44
【问题描述】:

我对 django 和 python 完全陌生,请帮助我完成以下查询:

我有 3 个模型,与给定的样本数据有多个外键关系

现在我需要通过 django ORM 或 Serializers 输出 3 个输出

  1. 对于给定的学生ID,显示每个科目的学生详细信息和分数

  2. 列出所有学生的总分(本例中为三门科目的总和)

  3. 根据给定的英语样本分数,所有学生在每个科目的平均分数为 65 , 95,平均为 80

    { Subject: "English", average: " 80" }
    
class Student(models.Model):
        student_id = ShortUUIDField(primary_key=True, editable=False)
        first_name = models.CharField(max_length=50)
        last_name  = models.CharField(max_length=50)

class Subjects(models.Model):
    subject_code = ShortUUIDField(primary_key=True, editable=False)
    subject_name = models.CharField(max_length=100)

class Reports(models.Model):
    student = models.ForeignKey(Student,on_delete=models.CASCADE,related_name='student_report')
    subject = models.ForeignKey(Subjects,on_delete=models.CASCADE,related_name='subject',default=None)
    marks   = models.IntegerField(max_length='3')
class Meta:
    unique_together = ("student", "subject")

样本数据

Student data

student_id  first_name  last_name
  1            abc        x
  2            def        y
 


Subjects data

subject_code  subject_name
    1          English
    2          Science
    3          Math


Reports data

 student_id  subject_id  marks 
     1          1         65
     1          2         75
     1          3         92
     2          1         95
     2          2         85
     2          3         62

【问题讨论】:

    标签: python-3.x django django-models django-rest-framework django-views


    【解决方案1】:

    您可能需要修改模型、序列化程序等,如下所示。

    2。列出所有学生的总分(在这种情况下是三门科目的总和)

    解决方案:您可以通过在“学生模型”中定义一个函数来计算总分并使用“@property”装饰器来计算每个学生的总分,这样您就可以像访问任何其他模型一样将该函数作为属性访问财产。因此,您的模型将如下定义。

    class Student(models.Model):
        student_id = ShortUUIDField(primary_key=True, editable=False)
        first_name = models.CharField(max_length=50)
        last_name  = models.CharField(max_length=50)
        
        @property
        def total_marks(self):
            reports = self.student_report.all()
            total_marks = sum([report.marks for report in reports])
            return total_marks
    

    要在每次调用“Student”序列化程序时访问此“total_marks”属性,您需要修改“Student”序列化程序,如下所示。

    class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ["student_id", "first_name", "last_name", "total_marks"]
    

    1.对于给定的学生 ID,显示每个科目的学生详细信息和分数

    解决方案:要实现此目的,您需要再次修改“学生”序列化程序,如下所示:

    class ReportsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Reports
        fields = "__all__"
    
    class StudentSerializer(serializers.ModelSerializer):
    student_report = ReportsSerializer(many=True, read_only=True)
    
    class Meta:
        model = Student
        fields = ["student_id", "first_name", "last_name", "total_marks", "student_report"]
    

    3.根据给定的英语样本分数,所有学生每门科目的平均成绩为65、95,平均为80

    解决方案:您需要修改您的“主题”模型,就像我们修改“学生”模型以获得“total_marks”一样,唯一的区别是我们将在此处计算“平均值”。

    class Subjects(models.Model):
        subject_code = ShortUUIDField(primary_key=True, editable=False)
        subject_name = models.CharField(max_length=100)
    
        @property
        def average(self):
            reports = self.subject.all()
            total_marks = sum([report.marks for report in reports])
            average_marks = total_marks / len(reports)
            return average_marks
    

    要在每次调用“主题”序列化程序时访问此“平均”属性,您将修改“主题”序列化程序,如下所示。

    class SubjectsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subjects
        fields = ["subject_code", "subject_name", "average"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多