Django 면접문제 시리즈(2)-ORM 복잡한 조회 실현

9863 단어 django
Django에 관심이 있다면 이 초상세한 과정을 보십시오.
다음 ORM 모델이 있다고 가정합니다.
from django.db import models

class Student(models.Model):
    """   """
    name = models.CharField(max_length=100)
    gender = models.SmallIntegerField()

    class Meta:
        db_table = 'student'

class Course(models.Model):
    """   """
    name = models.CharField(max_length=100)
    teacher = models.ForeignKey("Teacher",on_delete=models.SET_NULL,null=True)
    class Meta:
        db_table = 'course'

class Score(models.Model):
    """   """
    student = models.ForeignKey("Student",on_delete=models.CASCADE)
    course = models.ForeignKey("Course",on_delete=models.CASCADE)
    number = models.FloatField()

    class Meta:
        db_table = 'score'

class Teacher(models.Model):
    """   """
    name = models.CharField(max_length=100)

    class Meta:
        db_table = 'teacher'

이전에 배운 작업을 사용하여 다음 질의 작업을 수행합니다.
  • 평균 성적이 60점 이상인 학생의 id와 평균 성적을 조회한다.
  • 모든 학우의 id, 이름, 수강신청 수량, 총 성적을 조회한다.
  • 성이'이'인 선생님의 개수를 조회한다.
  • '이선생님'수업을 배우지 않은 학우의 id, 성명을 조회한다.
  • 배운 과정 id가 1과 2인 모든 학우의 id, 이름을 조회한다.
  • '황 선생님'이 가르친'모든 과목'을 배운 학우의 id, 이름을 조회한다.
  • 모든 과정 성적이 60점 이하인 학우의 id와 이름을 조회한다.
  • 모든 과목을 배우지 않은 학우의 id, 성명을 조회한다.
  • 모든 학생의 성명, 평균 점수를 조회하고 평균 점수에 따라 높은 것부터 낮은 것까지 순서를 정한다.
  • 각 과목의 성적의 최고와 최저점을 조회하여 다음과 같은 형식으로 표시한다. 과정 ID, 과정 명칭, 최고점, 최저점.
  • 무과목의 평균 성적을 조회하고 평균 성적에 따라 순서를 정한다.
  • 총 몇 명의 여학생, 몇 명의 남학생이 있는지 통계한다.
  • '황 선생님'의 모든 과정을 원래의 기초 위에서 5점을 더한다.
  • 두 개 이상의 불합격 학생의 id, 이름, 그리고 불합격 과정 수를 조회한다.
  • 각 과목의 수강신청 인원을 조회한다.

  • 답안 참조:
  • 평균 성적이 60점 이상인 학생의 id와 평균 성적을 조회한다.
    rows = Student.objects.annotate(avg=Avg("score__number")).filter(avg__gte=60).values("id","avg")
    for row in rows:
    print(row)
  • 모든 학우의 id, 성명, 수강신청 수, 총 성적을 조회한다.
    rows = Student.objects.annotate(course_nums=Count("score__course"),total_score=Sum("score__number"))
    .values("id","name","course_nums","total_score")
    for row in rows:
    print(row)
  • 성이'이'인 선생님의 개수를 조회한다.
    teacher_nums = Teacher.objects.filter(name__startswith=" ").count()
    print(teacher_nums)
  • '황선생님'수업을 배우지 않은 학우의 id, 성명을 조회한다.
    rows = Student.objects.exclude(score__course__teacher__name="   ").values('id','name')
    for row in rows:
    print(row)
  • id가 1과 2인 모든 학우의 id, 이름을 조회했다.
    rows = Student.objects.filter(score__course__in=[1,2]).distinct().values('id','name')
    for row in rows:
    print(row)
  • '황선생님'이 가르친 모든 과목의 학번, 성명을 조회한다.
    rows = Student.objects.annotate(nums=Count("score__course",filter=Q(score__course__teacher__name='   ')))
    .filter(nums=Course.objects.filter(teacher__name='   ').count()).values('id','name')
    for row in rows:
    print(row)
  • 모든 과정 성적이 60점 이하인 학우의 id와 이름을 조회한다.
    students = Student.objects.exclude(score__number__gt=60)
    for student in students:
    print(student)
  • 모든 과목을 배우지 않은 학우의 id, 성명을 조회한다.
    students = Student.objects.annotate(num=Count(F("score__course"))).filter(num__lt=Course.objects.count()).values('id','name')
    for student in students:
    print(student)
  • 모든 학생의 성명, 평균 점수를 조회하고 평균 점수에 따라 높은 것부터 낮은 것까지 순서를 정한다.
    students = Student.objects.annotate(avg=Avg("score__number")).order_by("-avg").values('name','avg')
    for student in students:
    print(student)
  • 각 과목의 성적의 최고와 최저점을 조회하여 다음과 같은 형식으로 표시한다. 과정 ID, 과정 명칭, 최고점, 최저점:
    courses = Course.objects.annotate(min=Min("score__number"),max=Max("score__number")).values("id",'name','min','max')
    for course in courses:
    print(course)
  • 각 과정의 평균 성적을 조회하고 평균 성적에 따라 순서를 정한다.
    courses = Course.objects.annotate(avg=Avg("score__number")).order_by('avg').values('id','name','avg')
    for course in courses:
    print(course)
  • 총 몇 명의 여학생, 몇 명의 남학생이 있는지 통계한다.
    rows = Student.objects.aggregate(male_num=Count("gender",filter=Q(gender=1)),female_num=Count("gender",filter=Q(gender=2)))
    print(rows)
  • '황 선생님'의 모든 과정을 원래의 기초 위에서 5점을 더한다.
    rows = Score.objects.filter(course__teacher__name='   ').update(number=F("number")+5)
    print(rows)
  • 두 개 이상의 불합격 학생의 id, 이름, 그리고 불합격 과정 수를 조회한다.
    students = Student.objects.annotate(bad_count=Count("score__number",filter=Q(score__number__lt=60))).filter(bad_count__gte=2).values('id','name','bad_count')
    for student in students:
    print(student)
  • 각 과목의 수강신청 인원을 조회한다.
    courses = Course.objects.annotate(student_nums=Count("score__student")).values('id','name','student_nums')
    for course in courses:
    print(course)
  • Django에 관심이 있다면 이 초상세한 과정을 보십시오.

    좋은 웹페이지 즐겨찾기