Django를 하다보면 DB관련 모델링 작업이나 로직을 수행할 때 DB에 대해 직접적으로 SQL쿼리를 이용하여 DB관련 작업을 진행하는 방식이 아닌 django ORM을 통해 DB 테이블을 생성하고, C.R.U.D를 할 수 있게 되어 있다. 이번 포스트에선 많은 queryset들 중에 사용했던 것 몇가지만 정리해 본다.
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
);
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 * FROM user_account;
accounts = Account.objects.all()
for account in accounts:
print(account.user_account)
print(account.password)
print(account.created_at)
print(account.updated_at)
SELECT * FROM Account
WHERE user_account='abc';
Account.objects.filter(user_account='abc')
해당 메소드는 DB에서 filter를 통해 원하는 조건의 데이터가 유무에 따라 True
, False
를 반환하는 메소드이다. queryset은 아니다 (type()
함수등을 통해 확인 가능) 어떤 특정 조건에 대해서 이벤트나 로직을 처리할 때 많이 쓰임.
해당 메소드는 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)
아래 메소드의 결과들은 모두다 같은 효과를 지니게 된다.
>>> Account.objects.create(user_account='ghi', password=5678)
>>> Account(
user_account='ghi',
password=5678,
).save()
둘다 모델 객체를 생성하여 실제 DB에 UPDATE를 진행하는 방법으로 알고 있으면 된다.
기타 다른 queryset이나 그에 해당하는 SQL 구문과 관련된 내용은 무작정 외워 나가는 것 보단 실제 필요에 따라 사용하면서 익혀 나가는 것을 추천한다.(djangoqueryset공식문서 참고)
정리 너무 잘 하셨네요.
큰 도움이 됩니다. 감사해요!