JustDoEat
[python/models] 간단한 내장 DB사용 공부 본문
오늘의 어리버리
■ models.py에서 null=true 안하면
T=Teacher(subject='과학') 이부분이 저장 안됌.
그래서 생성과 동시에 학생객체를 연결시켜줘야 하나 했는데 그럴필요가 없다고함. 나중에 한다고함.
■ cmd창에서 객체 생성 후 save()를 하고 그 후 작업을 해야 오류가 안나옴.
■외래키로 다대다 관계를 표기하려면 ManytoMany를 써야하는데 ForeignKey 를 써서 벙쪘다.
다대다 관계: ManytoMany
다대일 관계: ForeignKey
기록
■ManytoMany, ForeignKey 사용
■역참조 "나를 참고하는 객체(클레스)이름_set"
즉 영어선생님을 참조하는 학생들을 선생객체를 통해 역참조 하는 방법.
■ S = Students.objects.filter(name__contains='kim') 처럼 변수__contains 를 하면 필터링이 되는데
__icontains를 하면 대소문자 구분을 안해주는..
■T=T.student_set.all()
"나를 참고하는 객체(클레스)이름_set" 함으로써 역참조 ..
1.ManytoMany사용
pybo/models.py
from django.db import models
class Teacher(models.Model):
subject = models.CharField(max_length=100)
students = models.ManyToManyField('Student', related_name='teachers',null='true')
class Student(models.Model):
name = models.CharField(max_length=100)
S = Student(name='kimsw')
S.save()
S = Student(name='kimfw')
S.save()
S = Student(name='leesw')
S.save()
//학생 객체 생성
T=Teacher(subject='과학')
T.save()
T2=Teacher(subject='수학')
T2.save()
//선생 객체 생성
S = Students.objects.filter(name__contains='kim')
//학생이 가진.오브젝트들에.필터를씌우는데(이름에'kim'이 포함된 사람들)
T.students.set(S)
T.save()
//필터링한 결과를 집합 형태로 Teacher객체의 students값에 대입 후 저장
S=Students.objects.get(name='leesw')
//학생 객체중에 leesw 라는 이름을 가진 객체를 선택 후 변수S에 저장
2.ForeignKey 사용
class Teacher(models.Model):
subject = models.CharField(max_length=100)
def __str__(self):
return self.subject
class Student(models.Model):
name = models.CharField(max_length=100)
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
#학생이랑 연결된 선생님이 잘리면 해당선생님과 연결된 학생들도 삭제됨
def __str__(self):
return self.name
T = Teacher(subject='영어')
T.save()
T=Teacher.objects.get(subject='영어')
//선생객체 생성 후 영어 과목인 선생님을 T에 저장
S= Student(name='wjs',teacher=T)
T=T.student_set.all()
//"나를 참고하는 객체(클레스)이름_set" 역참조.
// 즉 영어선생님을 참조하는 학생들을 선생객체를 통해 역참조 하는 방법.
print(T)
결과: <QuerySet [<Student: wjs>]>