자주 사용하는 django orm 작업

3078 단어
# -*- coding: utf-8 -*-

from django.db import models
import sys

from django.db.models import Avg, Sum, Q

reload(sys)
sys.setdefaultencoding('utf8')
# Create your models here.

from django.db import models


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

    class Meta:
        db_table = 'student'

    def __str__(self):
        return self.name


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

    class Meta:
        db_table = 'teacher'

    def __str__(self):
        return self.name


class Course(models.Model):
    """   """
    name = models.CharField(max_length=100)
    teacher = models.ForeignKey(Teacher, on_delete=models.SET_NULL, null=True, blank=True, related_name="courses")
    cours = models.ManyToManyField(Student,blank=True,null=True)

    class Meta:
        db_table = 'course'

    def __str__(self):
        return self.name


class Score(models.Model):
    """   """
    student = models.ForeignKey(Student, on_delete=models.SET_NULL, null=True, blank=True, related_name="students")
    course = models.ForeignKey(Course, on_delete=models.SET_NULL, null=True, blank=True, related_name="courses")
    number = models.IntegerField()

    class Meta:
        db_table = 'score'

    def __str__(self):
        try:
            return self.student.name
        except:
            return "delete"

models 파일은 위와 같이 약간 불합리하게 설계되었을 수도 있으니, 그럭저럭 예를 들어 보자.
1. 평균 성적이 60점 이상인 학생의 id와 평균 성적을 조회한다.
Student.objects.annotate(num=Avg('students__number')).filter(num__gt=60).values('num','name')

2. 각 과목의 수강신청자 수를 조회한다.
Course.objects.annotate(num=Count('cours')).values("name","num")

3. 이씨 성을 가진 선생님을 조회한다.
Teacher.objects.filter(name__startswith=" ")
, ]>

4. 이 선생님의 수업을 배우지 않은 학생을 조회한다.
Student.objects.exclude(course__teacher__name='   ')

5. 국어와 수학 수업을 들은 학생을 구한다.
Student.objects.filter(course__name__in=["   ","   "]).distinct()

6. 4과목 이하의 학생을 선별한다.
Student.objects.annotate(num=Count(F('course'))).filter(num__lt=4).values('num','name')

7. 학생의 평균 점수를 구하고 높은 것부터 낮은 것까지 순서를 정한다.
Student.objects.annotate(avg=Avg('students__number')).order_by('-avg').values('avg','name')

8. 이 선생님의 수업을 듣는 학생에게 5점을 더한다.
Score.objects.filter(course__teacher__name="   ").update(number=F('number')+5)

9. 과목당 수강신청 인원수:
Course.objects.annotate(num=Count('cours')).values('num','name')

좋은 웹페이지 즐겨찾기