django ORM에 대하여

BG·2021년 6월 1일
0

django

목록 보기
2/2
post-thumbnail

ORM


orm은 database의 종속성을 벗어나 SQL을 모르는 사람이라도 dbms에 질의가 가능하다는 장점이 있습니다.

저도 요즘에 django orm공부를 하고 있어 사용해보면서 아래와 같은 차이점이 있어 잘못 사용하면 큰일 나겠구나 라고 느낀바가 있어 적어봅니다.

all()과 select_related() 비교


아래 주인과 강아지 모델이 있습니다.
강아지쪽이 주인을 참조하고 있는 OneToMany관계 입니다.

[model]

class Owner(models.Model):
    name = CharField(max_length=45)
    email = CharField(max_length=300)
    age = IntegerField()

    class Meta:
        db_table = "owners"
class Dog(models.Model):
    name = CharField(max_length=45)
    age = IntegerField()
    owner = ForeignKey(Owner, on_delete=DO_NOTHING)

    class Meta:
        db_table = "movies"

[view]

class DogsListView(View):
    def get(self, request):
        result = []
        
        # datas = Dog.objects.all()            # 1번
        # datas = Dog.objects.select_related() # 2번
        
        for data in datas:
            result.append(
                {
                    'name': data.name,
                    'age': data.age,
                    'owner_name': data.owner.name
                }
            )
        
        return JsonResponse({'result': result}, status=200)

[reult]

{
    "result": [
        {
            "age": 3,
            "name": "TEST_DOG",
            "owner_name": "TEST"
        },
        {
            "age": 12,
            "name": "DOG",
            "owner_name": "TEST"
        },
        {
            "age": 200,
            "name": "보더콜리",
            "owner_name": "TEST"
        },
        {
            "age": 22,
            "name": "test_dog2",
            "owner_name": "YBG"
        }
    ]
}

view에서 1번과 2번은 결과 값이 똑같습니다.
그렇다면 무엇이 다를까요?

[1번 결과]

[2번 결과]

1번 all() 메소드는 로그를 보면 쿼리가 5번 날라갔고, 2번 select_related()는 쿼리가 한번 날라갔습니다.

select_related()메소드는 메소드의 이름에서도 알수있듯이 관계된(related) 테이블을 조인하여 데이터를 한번에 가져오고 있고, all()메소드는 먼저 movies에 있는 모든 값들을 먼저 조회 하고 그 뒤에 순차적으로 참조하고 있는 owners테이블에 가서 참조된 값을 다시 조회하고 있습니다.

느낀점


결과 값이 같다고 하더라도 조금 더 효율적인 orm문법이 있을 수 있고, 로그를 보고 orm이 어떤 쿼리로 변하여 날라가는지 확인하는 습관을 가져야 겠다고 생각했습니다.

orm 로직이 어떻게 움직이는지 확인!!

profile
글쎄...?

0개의 댓글