쿼리셋과 DateField 주의점

김병욱·2020년 4월 30일
0

Django

목록 보기
14/15

restful api

restful api : https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

timezone.now() 문제해결법

TIME_ZONE = 'Asia/Seoul' 로 맞추고 timezone.localtime()을 써도 되지만 ,
장고의 settings.py 에서 TIME_ZONE = 'Asia/Seoul' 로 맞추고

USE_I18N = True
USE_L10N = True
USE_TZ = True

위의 값들을 주석처리 해버리면 timezone.now() 가 한국의 시간을 반환한다는것을 알았다.

DateField 에서 auto_now 와 auto_now_add 의 차이점

odels.py에서 DateField를 정의할 때 auto_now = True 는 수정할때마다 시간변경, auto_now_add = True 는 최초 만든날짜만 넣는다는것을 알게되었다.

migrate, migrations 주의사항

manage.py에서 migrations , migrate 시 항상 app이름을 넣어준다. (관계형db꼬임방지)

manage.py로 migrate할때 실제로 db에 어떻게 들어가는지 확인법

python manage.py sqlmigrate db이름 숫자값

위와 같이 실행하면 실제로 데이터베이스에 어떻게 들어가는지 확인할 수 있다.

class Meta 에 대하여

models.py에 모델 클래스안에 class Meta를 정의하고, 그안에 db_table = '클래스(테이블)명복수' 를 주면 실제로 데이터베이스 (sqlite3)에서도 테이블 명이 db_table 에 정의한 이름대로 바뀌게 된다. 예를들어, 클래스(테이블)명이 account라면 class Meta 안에 db_table 에 accounts(account의 복수)라고 넣는다

db 생성하는 쿼리셋 주의사항

모델명.objects.create(필드명=값) 는 내가 만든 db를 리턴하는데, 모델명(필드명=값) 으로 db를 생성할 시에는 리턴값이 없다. 따라서 모델명(필드명=값) 방법으로 생성할 시에는 무조건 .save() 함수로 저장을 해주어야 한다.

get 과 filter 쿼리셋의 차이

모델명.objects.get(필드명=값) 쿼리셋은 무조건 하나만 가져올 수 있다. 모델명.objects.filter(필드명=값) 쿼리셋과 차이점은 이 점ㅇ에 있다. get() 쿼리셋은 어떠한 조건을 주었을 때 리턴되는 db가 여러개 있으면 무조건 에러가 난다. 반대로 filter()는 어떠한 조건에 맞는 db가 여러개 있어도 상관없다. 그러므로 get() 쿼리셋은 어떠한 조건을 검색하여 db를 찾을때는 무조건 조건을 pk로 주자. 예를들어, account.objects.get(pk=1) 같이 pk값은 중복되지 않는 각 db의 고유한 숫자니까 pk값이 중복되는 여러 db가 리턴될 수 없기 때문이니까.

filter().first() , filter().last() 쿼리셋

filter() 쿼리셋은 어떠한 조건을 주어서 데이터베이스를 검색하였을 때 중복되는 여러 db가 존재할 수 도 있으니까 filter.first() 나 filter.last() 같은 함수로 제일 첫번째 db 또는 제일 마지막 db를 가져올 수 있다.

filter().update() 쿼리셋

모델명.objects.filter(필드명=값).update(필드명=값)

어떠한 조건을 주어 검색한 디비를 변경할 수 있다.

filter().values() 쿼리셋

모델명.objects.filter(필드명=값).values()

위의 쿼리셋은 filter 조건에 맞는 특정 db를 가져와 그 db의 모든 필드와 모든 값들을 리스트+딕셔너리 형태로 가져온다.

db명.필드명=값 으로 db수정할 때 주의사항

db명.필드명=값

objects.create() 말고 위와 같이 db를 수정할 때는 무조건 .save() 함수로 저장해주어야한다.

특정 db삭제 쿼리셋

db명.objects.filter(pk=2).delete() 조건에 맞는 db를 삭제한다.

쿼리셋 api reference 를 잘 참고하자.
https://kimdoky.github.io/django/2020/02/03/django-queryset-api/

profile
개발스터디

0개의 댓글