django framework 에서 데이터모델을 만들어주는 역할을 하고 있는 파일이다. models.py 파일안에 클래스형으로 데이터 모델을 만들어주면 장고가 ORM(object-oriented-mapping)을 통해 데이터베이스에 데이터 모델을 생성해준다.
시스템 2개가 있다고 생각해보자. 각 시스템은 다른 언어를 쓰고 있기 때문에 데이터를 주고 받을때 문제가 생긴다. 마찬가지로 django 에서는 python 언어를 사용하고, sql에서는 sql문을 사용하기 때문에 문제가 생길 수 있다. 하지만
장고는 이문제를 해결하기위해 ORM이라는 기술을 사용한다.
ORM은 python 으로 작성된 class 기반의 모델을 sql database 에 저장할 수 있게 자동으로 바꾸어 주는 역할은 한다.
QuerySet란? 인스턴스의 리스트 !
User.objects.create(name = 'Amuse')
obj = User()
obj.name = 'Ellie'
obj.save()
obj1 = User(name = 'Amuse')
obj2 = User(name = 'Ellie')
q = User.objects.get(name='Amuse')
만약 없으면 exception 발생시킨다.
sq = User.objects.all()
sq = User.objects.filter(name ='Amuse')
sq = User.objects.filter(name ="Ellie")
Amuse가 반환된다
! values() 와 values_list() 는 ORM 쿼리 최적화의 방법 중 하나로서 필요한 필드의 값만 가져올 수 있고 따라서 DB에 부하를 줄일 수 있다는 점을 알고 있자.
🕹모델 생성은 장고에서 지원해주는 models.Model 클래스를 상속받아 구현한다
🕹 username, age, email 를 가지고 있는 유저 모델을 만든다면 이런식으로 작성해주면 된다!
class User(models.Model):
username = models.CharField(max_length = 30)
age = models.IntegerField()
email = models.EmailField()
class Meta:
db_table = 'user' # db 내부에 테이블 이름 설정
def __str__(self):
return self.username
각 모델의 필드값에는 알맞은 데이터 타입을 넣어 주어야한다.
CharField() : 문자를 담을 수 있는 그릇
IntegerField() : 숫자를 담을 수 있는 그릇
EmailField() : 이메일을 담을 수 있는 그릇
OneToOne(): 일대일 관계를 나타날때 사용
ForeignKey(): 일대다 관계를 나타낼때 사용
ManyToMany(): 다대다 관계를 나타날때 사용
... 더 많은 정보는 공식홈페이지에서 참고..
class Profile(models.Model):
user = models.OneToOneField('User', on_delete=models.CASCADE)
image = models.ImageField()
context = models.TextField(max_length = 300)
def __str__(self):
return self.username
user 와 profile 의 1:1 관계를 OneToOneField를 통해 표현해준다.
on_delete= 옵션은 관계를 맺은 User 모델이 삭제될시 연결되 있는 테이블의 삭제여부를 정하는 옵션이다. 자세한 내용은 공식문서에서 찾아보자.
class Post(models.Model):
author = models.ForeignKey('User', on_delete=models.SET_NULL, null=True)
post_created = models.DateTimeField(auto_now_add=True)
context = models.TextField(max_length= 300)
def __str__(self):
return self.context
한명의 User가 여러개의 Post를 가질 수 있는 일대다 관계를 표현해주었다.
class Comment(models.Model):
author = models.ForeignKey('User', on_delete=models.SET_NULL, null=True)
comment_created = models.DateTimeField(auto_now_add=True)
context = models.TextField(max_length = 300)
def __str__(self):
return self.context
여러개의 포스트가 여러 Comment와 관계를 맺을 수 있고 여러개의 Comment 도 여러개의 Post와 관계를 맺을 수 있는 다대다 관계는 ManyToManyField 로 표현해준다.
./manage.py shell 에서 직접 데이터를 가지고 놀아 볼 수 도 있다.
모든 User 객체를 가져온다.
qs = User.objects.all()
유저 객체 생성 및 저장
User.objects.create(username = "Amuse", age = 19, email = "amusesla@gmail.com")