ORM이란 Object(객체), Relation(관계), Mapping(연결)을 의미한다. 객체 지향적인 방법을 사용하여 DB의 데이터를 쉽게 조작할 수 있다. Django에서 ORM이란 파이썬과 SQLite3사이의 통역사 역할을 해준다. 간단한 ORM을 공부해보자.
1. model.objects.filter(namecontains='hello')__
문자 검색을 할 수 있다.
2. model.objects.filter(nameicontains='hello)__
대소문자를 구분하지 않는다.
filter는 where절과 흡사하다.
EX) SELECT * FROM TABLE WHERE id =1
Table.objects.filter(id=1)
EX) SELECT * FROM TABLE;
Table.objects.all()
EX) SELECT * FROM TABLE WHERE NAME LIKE ('%hello%')
EX) SELECT * FROM TABLE ORDER BY(created_date)
Model.objects.all().order_by('created_date')
집계 함수 이용시 from django.db.models import Avg, Max, Min, Sum, Count
EX) SELECT COUNT(ID) FROM TABLE
Table.objects.aggregate(Count('id))
Table.objects.count() # null은 제외한다.
Table.objects.count(*) # null 포함
EX) joined_at = models.DateField() DateField타입
User.objects.filter(joined_at__gte=date(2022,1,1), joined_at__let=date(2022,12,31) #가입일이 2022년인 회원 조회
EX# joined_at = models.DateTimeField() DateTimeField타입
User.objects.filter(joined_at__range=( datetime.date(2022, 1, 1), datetime.date(2022, 12, 31)) ) #가입일이 2022년인 회원 조회
EX) SELECT ID, NAME FROM USER
User.objects.values('id','name') #dictionary 반환
EX) SELECT ID, NAME FROM USER
User.objects.values_list('id','name') Tuple 반환
class Dashboard(models.Model):
title = models.CharField(null=True,max_length=20)
content = models.TextField(null=True)
created_at = models.DateTimeField(null=True,auto_now_add=True)
update_at = models.DateTimeField(null=True,auto_now=True)
image = ProcessedImageField(upload_to='images/',
blank=True,processors=[ResizeToFill(300,150)],
format='JPEG',options={'quality':80})
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
class Comment(models.Model):
content = models.TextField()
create_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
dashboard = models.ForeignKey(Dashboard,on_delete=models.CASCADE)
def __str__(self):
return self.content
우리의 프로젝트는 하나의 유저가 여러 게시글을 작성할 수 있는 One-to-many relationships이고 하나의 게시글에는 여러 Comment가 작성될 수 있는 One-to-many relationships이다.
Forward (참조)
Foreign KEY를 가지고 있는 model instance는 related object에 접근할 수 있다. Dashboard Class에서 생성된 instance는 user객체에 접근할 수 있고 Comment Class에서 생성된 클래스는 Dashboard객체에 접근할 수 있다.
Backward (역참조) 1:N관계
마찬가지로 자신을 Foreign KEY로 가지고 있는 모델에 접근할 수 있다. '_set' 이다.
User.Dashboard_set.all()
User를 참조하고 있는 Dashboard를 모두 가져와!
Dashboard.Comment_set.all()
Dashboard를 참조하고 있는 Comment인스턴스를 모두 가져와!
Backward (역참조) ManyToMany관계
만약 a라는 Model에 b라는 Model의 Foreign KEY를 정의했다고 해보자. 그렇다면 b Model에서 a를 쓰고 싶을 땐 어떻게 할까? b.a_set이다. 여기서 중요한건 모두 소문자로 쓰도록 하자.
https://htkim298.medium.com/django-%EC%9E%A5%EA%B3%A0-orm-%EC%A0%95%EB%A6%AC-cc7c6390cf1
잘 정리해놓은 글
https://www.qu3vipon.com/django-orm
잘 봤습니다. 좋은 글 감사합니다.