[django] 데이터 모델 - models.py[수정하기]

김기용·2020년 10월 31일
0
post-thumbnail

⚡️ models.py

django framework 에서 데이터모델을 만들어주는 역할을 하고 있는 파일이다. models.py 파일안에 클래스형으로 데이터 모델을 만들어주면 장고가 ORM(object-oriented-mapping)을 통해 데이터베이스에 데이터 모델을 생성해준다.


⚡️ ORM(object-oriented-mapping)

시스템 2개가 있다고 생각해보자. 각 시스템은 다른 언어를 쓰고 있기 때문에 데이터를 주고 받을때 문제가 생긴다. 마찬가지로 django 에서는 python 언어를 사용하고, sql에서는 sql문을 사용하기 때문에 문제가 생길 수 있다. 하지만
장고는 이문제를 해결하기위해 ORM이라는 기술을 사용한다.

ORM은 python 으로 작성된 class 기반의 모델을 sql database 에 저장할 수 있게 자동으로 바꾸어 주는 역할은 한다.


CRUD - CREATE, READ , UPDATE, DELETE

QuerySet란? 인스턴스의 리스트 !

🕹 Create() 인스턴스 생성과 동시에 저장

	User.objects.create(name = 'Amuse')

🕹 save() 변수에 선언된 인스턴스를 저장

obj = User()
obj.name = 'Ellie'
obj.save()

🕹 bulk_create() 여러 인스턴스를 저장

obj1 = User(name = 'Amuse')
obj2 = User(name = 'Ellie')


READ

🕹 get() 한가지의 인스턴스를 반환

q = User.objects.get(name='Amuse')

만약 없으면 exception 발생시킨다.

🕹 all() 전체 인스턴스 불러오기

sq = User.objects.all()

🕹 filter() 조건에 맞는 값을 쿼리세트로 반환

sq = User.objects.filter(name ='Amuse')

🕹 exclude() 조건에 맞는 값을 제외 후 반환

sq = User.objects.filter(name ="Ellie")
Amuse가 반환된다

🕹 values() 쿼리 세트를 key:value 을 가진 dic 형태로 반환한다.

🕹 values_list() 쿼리 세트를 value 값만 가진 tuple 형태로 반환


! values() 와 values_list() 는 ORM 쿼리 최적화의 방법 중 하나로서 필요한 필드의 값만 가져올 수 있고 따라서 DB에 부하를 줄일 수 있다는 점을 알고 있자.


CREATE

🕹모델 생성은 장고에서 지원해주는 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")
profile
매일 새로운 배움을 통해 꾸준히 성장하는 것을 목표를 두고 있습니다. 논리적인 사고로 문제해결 하는것에 희열을 느끼고 언젠가 제가 만든 결과물들이 사람들에게 편이를 제공하며 사용되는 날을 간절히 소망하고 있습니다. 🙏

0개의 댓글