Django ORM

Happy_JG·2023년 7월 29일
0

Django

목록 보기
23/32
post-thumbnail

ORM

ORM이란 Object(객체), Relation(관계), Mapping(연결)을 의미한다. 객체 지향적인 방법을 사용하여 DB의 데이터를 쉽게 조작할 수 있다. Django에서 ORM이란 파이썬과 SQLite3사이의 통역사 역할을 해준다. 간단한 ORM을 공부해보자.

조건 WHERE

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%')

정렬 ORDER BY

EX) SELECT * FROM TABLE ORDER BY(created_date)
Model.objects.all().order_by('created_date')

집계 aggregate()

집계 함수 이용시 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 포함

날짜 BETWEEN , RANGE

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년인 회원 조회

특정 컬럼의 결과 출력 VALUES, VALUES_LIST

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

우리의 프로젝트는 하나의 유저가 여러 게시글을 작성할 수 있는 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

profile
hello!

1개의 댓글

comment-user-thumbnail
2023년 7월 29일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기