[Django] ORM 정리

송현아·2021년 8월 24일
0

Django

목록 보기
2/4
post-thumbnail

ORM(Object Relational Mapping)

  • 객체(Object)와 관계형 데이터베이스의 데이터를 매핑해주는 과정을 의미한다.
  • 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 SQL 쿼리문 없이도 데이터베이스의 데이터들을 다룰 수 있다.

Django의 model은 ORM 역할을 한다. 즉, SQL을 직접 작성하지 않아도 model을 통해 데이터 베이스로 접근이 가능하다.

  • Django에서 지원하는 model 필드 타입

    • AutoField, BooleanField, CharField, DateTimeField, FileField, ImageField,TextField
  • Django에서 지원하는 주요 필드 옵션

    • null (DB 옵션) : DB 필드에 NULL 허용 여부 (디폴트 : False)
    • unique (DB 옵션) : 유일성 여부 (디폴트 : False)
    • blank : 입력값 유효성 (validation) 검사 시에 empty 값 허용 여부 (디폴트 : False)
    • default : 디폴트 값 지정. 값이 지정되지 않았을 때 사용
    • verbose_name : 필드 레이블. 지정되지 않으면 필드명이 쓰여짐
    • validators : 입력값 유효성 검사를 수행할 함수를 다수 지정
      • 각 필드마다 고유한 validators 들이 이미 등록되어있기도 함
      • 예 : 이메일만 받기, 최대길이 제한, 최소길이 제한, 최대값 제한, 최소값 제한 등
    • choices (form widget 용) : select box 소스로 사용
    • help_text (form widget 용) : 필드 입력 도움말
    • auto_now_add : Bool, True 인 경우, 레코드 생성시 현재 시간으로 자동 저장

그래서 이번에는 ORM을 이용해서 데이터를 다루는 방법을 알아보았다. 여기에서 내가 개발할 때 사용한 데이터 모델은 Template이라는 모델이다.

  • Template

    upload_files(파일 저장 경로), name(파일명), description(파일 설명), uploaded_at(파일 업로드 일자), id (파일 인덱스)

class Template(models.Model):
    upload_files = models.FileField(blank=False, null=False)
    name = models.CharField(max_length = 50)
    description = models.CharField(max_length=200)
    uploaded_at = models.DateTimeField(auto_now_add=True)
    id = models.AutoField(primary_key=True)
    class Meta:
        # table name
        db_table = 'Templates_info'

📎 데이터 가져오기

  • objects.all() : Template 객체에 저장된 데이터를 모두 가져올 수 있다.
Template.objects.all()
  • objects.get() : Template 객체 중에서 특정 조건을 만족하는 데이터를 가져올 수 있다.
Template.objects.get(id=1)

📎 데이터 생성하기

  • objects.create() : Template 객체에 정의된 각각의 필드에 데이터를 넣어 새로운 데이터를 추가할 수 있다.
>>> template = Tempalte()
>>> template.name = 'openstack instance'
>>> template.description = 'test'
.....
>>> template.save()

📎 데이터 삭제하기

  • 원하는 필드를 이용해서 객체를 삭제할 수 있다.
>>> d = Tempalte.objects.get(name='openstack instance')
>>> d.delete()

ORM은 REST API를 개발하는 데 아주 유용했다. 복잡한 SQL 쿼리를 사용하지 않고도 데이터를 관리하는 것이 가장 큰 장점이였다.

하지만 ORM에 너무 의존하면 안될 것 같다. 자칫하다간 SQL 쿼리문과 DB에 대한 공부를 소홀히 할 수 있을 것 같다.

0개의 댓글