[Django] Django ORM queryset 정리(model, filter, all, get, filter, exists, create, save)

ybear90·2020년 2월 10일
2

Django

목록 보기
9/12

Django를 하다보면 DB관련 모델링 작업이나 로직을 수행할 때 DB에 대해 직접적으로 SQL쿼리를 이용하여 DB관련 작업을 진행하는 방식이 아닌 django ORM을 통해 DB 테이블을 생성하고, C.R.U.D를 할 수 있게 되어 있다. 이번 포스트에선 많은 queryset들 중에 사용했던 것 몇가지만 정리해 본다.

CREATE TABLE

SQL

CREATE TABLE "user_account" (
  "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "user_account" varchar(50) NOT NULL,
  "password" varchar(300) NOT NULL,
  "created_at" datetime NOT NULL,
  "updated_at" datetime NOT NULL
);

Python Django ORM

class Account(models.Model):
    user_account    = models.CharField(max_length=50)
    password        = models.CharField(max_length=300)
    created_at      = models.DateTimeField(auto_now_add=True)
    updated_at      = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'user_account'

DB 모델링 할 때 가장 많이 쓰게 되는 ORM.

SELECT

Select all rows

SQL

SELECT * FROM user_account;

Python Django ORM

accounts = Account.objects.all()

for account in accounts:
  	print(account.user_account)
    print(account.password)
    print(account.created_at)
    print(account.updated_at)

WHERE Clause

SQL

SELECT * FROM Account
WHERE user_account='abc';

Python Django ORM

Account.objects.filter(user_account='abc')

filter() 메소드와 같이 쓰였던 exists()

해당 메소드는 DB에서 filter를 통해 원하는 조건의 데이터가 유무에 따라 True, False를 반환하는 메소드이다. queryset은 아니다 (type()함수등을 통해 확인 가능) 어떤 특정 조건에 대해서 이벤트나 로직을 처리할 때 많이 쓰임.

get() 메소드

해당 메소드는 queryset이 아닌 모델 객체를 반환하는 함수이다. 특정 column 조건에 해당하는 결과를 객체로 반환하는 함수로 찾는 결과가 없다면 DoesNotExist예외를 발생시킨다. 따라서 해당 메소드를 이용하여 원하는 결과를 가져오고자 할 때에는

try-except 구문등으로 예외처리를 해주는 것이 좋다.

# 실제 해당하는 조건의 결과가 없을 경우 발생하는 예외
>>> Account.objects.get(user_account='james')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/YB/miniconda3/envs/django_tutorial/lib/python3.8/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/YB/miniconda3/envs/django_tutorial/lib/python3.8/site-packages/django/db/models/query.py", line 415, in get
    raise self.model.DoesNotExist(
account.models.Account.DoesNotExist: Account matching query does not exist.
# try-except 사용예제
try:
    if Account.objects.filter(user_account=account_data['user_account']).exists():
        account = Account.objects.get(user_account=account_data['user_account'])

        if account.password == account_data['password']:
            return JsonResponse({'message':'Welcome back!'}, status=200)
        return HttpResponse(status=401)

      return HttpResponse(status=400)

    except KeyError:
        return HttpResponse(status=400)

UPDATE

아래 메소드의 결과들은 모두다 같은 효과를 지니게 된다.

>>> Account.objects.create(user_account='ghi', password=5678)
>>> Account(
		user_account='ghi',
		password=5678,
).save()

둘다 모델 객체를 생성하여 실제 DB에 UPDATE를 진행하는 방법으로 알고 있으면 된다.

ETC

기타 다른 queryset이나 그에 해당하는 SQL 구문과 관련된 내용은 무작정 외워 나가는 것 보단 실제 필요에 따라 사용하면서 익혀 나가는 것을 추천한다.(djangoqueryset공식문서 참고)

Reference

profile
wanna be good developer

1개의 댓글

comment-user-thumbnail
2020년 6월 11일

정리 너무 잘 하셨네요.
큰 도움이 됩니다. 감사해요!

답글 달기