restful api : https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
TIME_ZONE = 'Asia/Seoul' 로 맞추고 timezone.localtime()을 써도 되지만 ,
장고의 settings.py 에서 TIME_ZONE = 'Asia/Seoul' 로 맞추고
USE_I18N = True
USE_L10N = True
USE_TZ = True
위의 값들을 주석처리 해버리면 timezone.now() 가 한국의 시간을 반환한다는것을 알았다.
odels.py에서 DateField를 정의할 때 auto_now = True 는 수정할때마다 시간변경, auto_now_add = True 는 최초 만든날짜만 넣는다는것을 알게되었다.
manage.py에서 migrations , migrate 시 항상 app이름을 넣어준다. (관계형db꼬임방지)
python manage.py sqlmigrate db이름 숫자값
위와 같이 실행하면 실제로 데이터베이스에 어떻게 들어가는지 확인할 수 있다.
models.py에 모델 클래스안에 class Meta를 정의하고, 그안에 db_table = '클래스(테이블)명복수' 를 주면 실제로 데이터베이스 (sqlite3)에서도 테이블 명이 db_table 에 정의한 이름대로 바뀌게 된다. 예를들어, 클래스(테이블)명이 account라면 class Meta 안에 db_table 에 accounts(account의 복수)라고 넣는다
모델명.objects.create(필드명=값) 는 내가 만든 db를 리턴하는데, 모델명(필드명=값) 으로 db를 생성할 시에는 리턴값이 없다. 따라서 모델명(필드명=값) 방법으로 생성할 시에는 무조건 .save() 함수로 저장을 해주어야 한다.
모델명.objects.get(필드명=값) 쿼리셋은 무조건 하나만 가져올 수 있다. 모델명.objects.filter(필드명=값) 쿼리셋과 차이점은 이 점ㅇ에 있다. get() 쿼리셋은 어떠한 조건을 주었을 때 리턴되는 db가 여러개 있으면 무조건 에러가 난다. 반대로 filter()는 어떠한 조건에 맞는 db가 여러개 있어도 상관없다. 그러므로 get() 쿼리셋은 어떠한 조건을 검색하여 db를 찾을때는 무조건 조건을 pk로 주자. 예를들어, account.objects.get(pk=1) 같이 pk값은 중복되지 않는 각 db의 고유한 숫자니까 pk값이 중복되는 여러 db가 리턴될 수 없기 때문이니까.
filter() 쿼리셋은 어떠한 조건을 주어서 데이터베이스를 검색하였을 때 중복되는 여러 db가 존재할 수 도 있으니까 filter.first() 나 filter.last() 같은 함수로 제일 첫번째 db 또는 제일 마지막 db를 가져올 수 있다.
모델명.objects.filter(필드명=값).update(필드명=값)
어떠한 조건을 주어 검색한 디비를 변경할 수 있다.
모델명.objects.filter(필드명=값).values()
위의 쿼리셋은 filter 조건에 맞는 특정 db를 가져와 그 db의 모든 필드와 모든 값들을 리스트+딕셔너리 형태로 가져온다.
db명.필드명=값
objects.create() 말고 위와 같이 db를 수정할 때는 무조건 .save() 함수로 저장해주어야한다.
db명.objects.filter(pk=2).delete() 조건에 맞는 db를 삭제한다.
쿼리셋 api reference 를 잘 참고하자.
https://kimdoky.github.io/django/2020/02/03/django-queryset-api/