파이썬에서 제공하는 error 메세지가 아닌 에러 메세지를 추가적으로 생성하고 발생시키는 방법을 설명합니다.

오류 생성

오류는 다음과 같이 파이썬 내장 클래스인 Exception클래스를 상속하여 만들 수 있습니다.

class MyError(Exception):
    pass


그리고 다음과 같이 간단한 코드를 개발해 에러를 일부러 발생시켜보겠습니다.

def test(str):
	if str =='1':
		raise MyError()
	else:
		print("ok")
 
test("0")
test("1")

위를 실행할 경우 0은 출력이 되지만 1에서는 MyError()가 발생합니다.


만약 오류메세지를 이용하고 싶다면 다음처럼 예외처리를 합니다.

try:
    test("0")
    test("1")
except MyError as e:
    print(e)


실행을 하면 아무런 오류메세지가 출력이 되지 않습니다. 위의 MyError에 __str__ method를 구현해야 오류메세지를 출력할 수 있습니다. 

lass MyError(Exception):
    def __str__(self):
        return "custom error message"


에러 발생시점에 오류 메세지를 전달하고 싶으면 다음과 같이 수정합니다.

# 방법1
class CustomError(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg
 
def test(str):
	if str =='1':
		raise MyError("1test")
	else:
		print("ok")
 
try:
    test("0")
    test("1")
except MyError as e:
    print(e)
 
# 방법2
class CustomError(Exception):
    def __init__(self, msg):
        super().__init__(msg)
 
# 호출 부분 동일


Exception으로 떨어지는 에러 메세지는 타입이 각 구현된 에러 클래스로 떨어지기 때문에 json으로 파싱이 되지 않습니다. 따라서 except에서 나온 에러메세지를 json으로 묶을 경우, str(error message)로 먼저 문자열로 변환한 다음 파싱을 진행해야 합니다.

Golang의 가장 큰 장점중 하나인 멀티플랫폼 지원입니다. 다른 OS에서 사용하기 위해 크로스 컴파일을 해야하는데 Golang 1.5이상 버젼부터 지원이 됩니다.


지원 플랫폼

$ GOOS$ GOARCH
darwin386
darwinamd64
darwinarm
darwinarm64
dragonflyamd64
freebsd386
freebsdamd64
freebsdarm
linux386
linuxamd64
linuxarm
linuxarm64
linuxppc64
linuxppc64le
linuxmips64
linuxmips64le
netbsd386
netbsdamd64
netbsdarm
openbsd386
openbsdamd64
openbsdarm
plan9386
plan9amd64
solarisamd64
windows386
windowsamd64

설정법

  1. 먼저 GOOS와 GOARCH 환경을 원하는 플랫폼에 맞게 설정합니다.
  2. go build -v 패키지이름 명령어로 원하는 패키지를 컴파일합니다.
$ env GOOS=windows GOARCH=amd64 go build -v company.go

env는 명령어 입력한 순간에 설정한 환경으로 호출이 됩니다. 호출이 된 이후 다시 reset이 되니 해당 명령어로 환경을 변경할 때, 한 줄에 이어서 써야됩니다.

(env GOOS=windows 이것만 치고 엔터를 치면 GOOS가 windows로 잡히지 않음)


장고에서 제공하는 모델을 사용하기 위해선 from 앱이름.models import 모델명, 모델명1과 같이 선언해야 합니다.

먼저 django orm 사용에서 복잡한 쿼리에 대해 적합하지 않습니다. 예를 들어, 두 테이블 간 join을 하기 위해선 foriegn key가 잡혀 있어야만 join이 가능한 상태입니다. 복잡한 쿼리의 같은 경우 orm을 지양하는 것이 좋습니다.

또한 여기서는 restframework도 같이 설명하고 있기 때문에 레퍼런스를 보고 싶은 분은 아래 링크를 확인해 주시기 바랍니다.

  1. http://www.django-rest-framework.org/
  2. http://www.django-rest-framework.org/api-guide/serializers/

Select

Get

단일 행 결과를 반환하는 model.objects.get()는 타입이 Query Set이 아닌 단일행 (모델타입)으로 나옴

  • 사용은 value_name.column_name 과 같이 . 으로 컬럼 이름을 써서 사용합니다.
  • get() 안에 조건을 제시할 수 있습니다.(sql의 where절 과 동일)
  • get()은 단일행을 반환하므로 다른 method들을 get() 다음에 연결하여 사용할 수 없습니다.
key = model1.objects.get(pk=pk)
print(key.name)

만약 get을 사용했는데 반환되는 값이 1개 이상일 경우 에러가 나옵니다.

All

  전체 자료를 불러오는 model.objects.all()은 QuerySet 타입으로 반환

  • 사용은 dictionary를 사용하는 것과 동일하게 사용.
key = model2.objects.all()
print(key[0]['name'])


만약 get()과 같이 단일 행의 결과가 존재하지 않을 경우 모델명.DoesNotExist의 exception으로 처리가 되지만 all()과 같은 여러 행이 나오는 경우엔 exception이 아닌 빈값으로 처리가 됩니다.

Filter

앞에서 get()은 단일행을 조건을 걸어 출력하는 것이면, filter는 조건에 맞는 여러 행을 출력하는 것입니다. 사용은 model.objects.filter()로 타입은 QuerySet입니다. (objects.all().filter() 와 동일한 기능입니다. (all() 생략) )

value = key = model2.objects.filter(name='lee')
print(key[0]['name'])


get과 filter에 각 조건을 걸 수 있으며 조건은 and로 결합됩니다.

조건 키워드

 키워드설 명사용예

 __lt / __gt

__lte / __gte

보 다 작다 / 보다 크다

같거나 보다 작다 / 같거나 보다 크다

id가 1보다 큰 자료 검색

>>> Department.objects.filter(id__gt=1)

[<Department: Computer Science>]

 __in주어진 리스트 안에 존재하는 자료 검색

id 가 2, 3, 5 인 자료 검색

 >>> Department.objects.filter(id__in=[2, 3, 5])
[<Department: Computer Science>]

 __year / __month / __day해당 년도, 월, 일 자료 검색>>>Entry.objects.filter(pub_date__year=2005)
__isnull해 당 열의 값이 null 인 자료  검색

>> Department.objects.filter(dName__isnull=True)

[]

 __contains / __icontains

해당 열의 값이 지정한 문자열을 포함하는 자료 검색

(__icontains 는 대소문자를 구별하지 않음)

>>> Department.objects.filter(dName__contains='puter')

[<Department: Computer Science>]

 __startswith / __istartswith

해당 열의 값이 지정한 문자열로 시작하는 자료 검색

(__istartswith 는 대소문자를 구별하지 않음)

>>> Department.objects.filter(dName__startswith='Com')
[<Department: Computer Science>]
 __endswith / __iendswith

해당 열의 값이 지정한 문자열로 끝나는 자료 검색

(__iendswith 는 대소문자를 구별하지 않음)

>>> Department.objects.filter(dName__contains='nce')
[<Department: Computer Science>]
 __range

문 자, 숫자, 날짜의 범위를 지정함

(SQL의 BETWEEN에

>>> Department.objects.filter(id__range=(2, 10))

Order by

model.objects.order_by()로 사용하며 기본 정렬순서는 오름차순 정렬입니다. 내림차순으로 정렬할 경우 컬러명 앞에 -를 붙여 사용합니다.

value = model.objects.order_by('-pk') # 내림차순 정렬
value = model.objects.order_by('pk') # 오름차순 정렬

Value

model.objects.values()와 같이 사용하며 기능은 sql의 select에 해당합니다. value를 사용하지 않으면 sql의 select * 와 같이 전체 컬럼을 출력합니다.

value = model.objects.values('pk') # query set 타입으로 pk만 출력

Aggregate

sql에서 max, min, count 등과 같이 다중 행을 단일 행으로 출력해주는 기능을 해줍니다.

model.objects.aggregate()와 같이 사용되며 단일행을 반환하므로 aggregate()뒤에 다른 method를 붙여 사용할 수 없습니다.

from django.db.models import Max
value = model.objects.aggregate(temp_name=Max('pk')) # temp_name은 사용자가 임의로 정할 수 있음
print(value['temp_name'])


from django.db.models import Max
from django.db.models.functions import Coalesce
value = model.objects.aggregate(temp_name=Coalesce(Max('pk'),10000)) # temp_name은 사용자가 임의로 정할 수 있음
print(value['temp_name'])

Annotate

----------------;;--------------------------


Insert

Django Model 사용

모델을 사용하여 insert를 하는 방법은 2가지가 있습니다. 보통의 경우는 rest framework를 사용해 저장할 값에 대한 validation check를 한 다음 저장하는 형식이 안전하기 때문에 rest framework를 사용하는 것을 권장합니다.

save() 사용

data = model2(name='lee')
data.save() #model2 라는 테이블에 name이 'lee'라는 데이터 insert

save()를 하지 않을 경우 메모리 상에 저장할 데이터의 Instance만 존재하고 테이블에 저장되지는 않습니다.

objects.create() 사용

data = model2.objects.create(name='lee')

objects.create를 할 경우 .save()를 할 필요가 없이 바로 저장이 됩니다.

Rest framework 사용

Django로 rest api를 만드려고 할 때, 가장 널리 쓰이는 프레임워크 중 하나입니다. 해당 프레임워크를 사용해 손쉽게 insert를 할 수 있습니다. (설치 및 사용법은 Django REST Framework에 설명되어 있습니다.)

serializer = CommonTax1InSerializer(data=json_format_data, partial=True)

if serializer.is_valid():
    serializer.save()

json_format_data는 json(dict)형식의 데이터입니다. 

partial은 테이블 내의 일부분만 insert할 때, 필요한 아규먼트입니다. 만약 partial을 제외하고 serializer에 명시한 값 중 일부분만 insert하려하면 에러가 나게 됩니다.

.save()를 하기 위해선 먼저 validation 확인을 한 다음 진행해야 됩니다.


Update

Django Model 사용

단일 업데이트

먼저 1개 단일 행의 데이터를 변경하는 것은 다음과 같습니다.

data = model2.objects.get(pk=pk)
data.name = 'kim'
data.save()

insert와 유사하게 save()를 사용합니다. 만약 해당 object가 기존 테이블에 존재하지 않으면 insert 기능을 수행하고, 그렇지 않으면 update 기능을 수행합니다.

위처럼 get()으로 받아와서 update를 하는 경우는 pk가 단일 컬럼으로 잡혀있는 경우에만 사용이 가능합니다. (여러 컬럼이 묶여 하나의 pk를 이루는 형태에서는 불가능)

다중 업데이트

여러 행의 데이터 및 여러 컬럼이 묶여 하나의 pk를 이루는 형태의 테이블에서 데이터를 변경하는 것은 다음과 같습니다.

model2.objects.filter(name='lee', age='20').update(**update_dict)

**update_dict에 대한 설명은 다음 parameter (또는 argument) 앞에 *, ** 의미에 정리되어 있습니다.

Rest framework 사용

단일 업데이트

먼저 1개 단일 행의 데이터를 변경하는 것은 다음과 같습니다.

pk = model2.objects.get(pk=pk)
serializer = model2(pk, data=json_data)
if serializer.is_valid():
    serializer.save()

먼저 업데이트할 단일행을 구한다음, 모델 클래스의 아규먼트로 instance에 pk를 넣고 data에 변경할 값의 json(dict) 값을 넣습니다.

다중 업데이트

먼저 다중 행의 데이터를 변경하는 것은 다음과 같습니다.

queryset = model2.objects.all()
serializer = BookSerializer(queryset, many=True)
if serializer.is_valid():
    serializer.save()


여러 컬럼이 묶여 하나의 pk를 이루고 있는 형태에서 rest framework를 사용해 update를 하려고 할 때 방법이 복잡하기 때문에 django model을 사용하는 것이 낫습니다.


Delete

delete는 update와 유사하게 동작하지만 단일 행이나 복수 행 구분없이 똑같이 delete()메소드를 사용합니다. 또한 rest framework나 django model 둘 다 같은 방식을 사용하고 있습니다.

단일 삭제

먼저 1개 단일 행의 데이터를 삭제하는 것은 다음과 같습니다.

pk = model2.objects.get(pk=pk)
pk.delete()

다중 삭제

여러 행 및 쿼리 결과의 데이터를 삭제하는 것은 다음과 같습니다.

model2.objects.filter(name='lee',age='20').delete()


파이썬이란?

파이썬이란 1990년 암스테르담의 귀도 반 로섬(Guido Van Rossum)에 의해 만들어진 인터프리터 언어이다. 귀도는 이 파이썬이라는 이름을 본인이 좋아하는 "Monty Python's Flying Circus"라는 코미디 쇼에서 따왔다고 한다. 파이썬(Python)의 사전적인 뜻은 고대 신화 속의 파르나수스(Parnassus) 산의 동굴에 살던 큰 뱀으로서, 아폴로가 델파이에서 파이썬을 퇴치했다는 이야기가 전해지고 있다. 대부분의 파이썬 책 표지와 아이콘이 뱀 모양으로 그려져 있는 이유가 여기에 있다.

현재 파이썬은 국내에서는 많이 알려져 있지 않지만 외국에서는 학습의 목적뿐만 아니라 실용적인 부분에서도 많이 사용되고 있는데 그 대표적인 예는 바로 구글(Google) 이다. 구글에서 만들어진 소프트웨어의 50%이상이 파이썬으로 만들어졌다고 한다. 이 외에도 유명한 것을 몇가지 들어보면 Dropbox(파일 동기화 서비스), Django(파이썬 웹 프레임워크)등을 들 수 있다.

또한 파이썬 프로그램은 공동작업과 유지보수가 매우 쉽고 편하기 때문에 이미 다른 언어로 작성된 많은 프로그램과 모듈들이 파이썬으로 다시 재구성되고 있는 상황이다. 국내에서도 그 가치를 인정받아 사용자층이 더욱 넓어져 가고 있고, 파이썬을 이용한 프로그램을 개발하는 기업체들이 늘어가고 있는 추세이다.

파이썬 특징

인간다운 언어

프로그래밍이란 컴퓨터에 인간이 생각하는 것을 입력시키는 행위라고 할 수 있다. 앞으로 살펴볼 파이썬 문법들에서도 볼 수 있겠지만 파이썬은 사람이 생각하는 방식을 그대로 표현할 수 있도록 해 주는 언어이다. 따라서 프로그래머는 굳이 컴퓨터식 사고 방식으로 프로그래밍을 하려고 애쓸 필요가 없다. 이제 곧 어떤 프로그램을 구상하자마자 생각한 대로 쉽게 술술 써내려가는 여러분의 모습에 놀라게 될 것이다. 아래 예문을 보면 이 말이 쉽게 이해될 것이다.

if 4 in [1,2,3,4]: print ("4가 있습니다")

위의 예제는 다음처럼 읽을 수 있다.

"만약 4가 1,2,3,4중에 있으면 "4가 있습니다"를 출력한다."

프로그램을 모르더라도 직관적으로 무엇을 뜻하는지 알 수 있지 않겠는가? 마치 영어문장을 읽는 듯한 착각에 빠져든다.

쉬운 문법으로 인한 빠른 학습

어려운 문법과 수많은 규칙들에 둘러싸인 언어에서 탈피하고 싶지 않은가? 파이썬은 문법 자체가 아주 쉽고 간결하며, 사람의 사고 방식과 매우 닮아있다. 배우기 쉬운 언어, 활용하기 쉬운 언어가 가장 좋은 언어가 아닐까? 참고로 프로그래밍 경험이 있는 어떤 사람(Eric Raymond)은 파이썬을 공부한지 단 하루만에 자신이 원하는 프로그램을 작성할 수 있었다고 한다. 

강력함

파이썬으로 프로그래머는 대부분의 모든 일들을 해낼 수가 있다. 물론 시스템 프로그래밍, 하드웨어 제어, 매우 복잡하고 많은 반복연산 등은 파이썬과는 어울리지 않는다. 하지만 이러한 몇 가지를 제외하면 파이썬으로 할 수 없는 것은 거의 없다고 해도 과언이 아니다.

또한 파이썬은 위의 약점을 극복할 수 있게끔 다른 언어로 만든 모듈을 파이썬 프로그램에 포함할 수가 있다. 파이썬과 C는 찰떡궁합이란 말이 있다. 즉, 프로그램의 전반적인 뼈대는 파이썬으로 만들고 빠른 속도를 필요로 하는 부분은 C로 만들어서 파이썬 프로그램 안에 포함시키자는 것이다. (정말 놀라울 정도로 영악한 언어가 아닌가?) 사실 파이썬 라이브러리 중에는 순수 파이썬만으로 제작된 것도 많지만 C로 만들어진 것도 많다. C로 만들어진 것들은 대부분 속도가 빠르다.

무료

파이썬은 오픈소스이므로 당연히 무료이다. 언제 어디서든 파이썬을 다운로드하여 사용할 수 있고, 사용료를 지불해야 할 필요가 없다.

간결함

파이썬은 간결하다. 이 간결함은 파이썬을 만든 귀도(Guido)의 의도적인 산물이다. 만약 어떤 언어(Perl?)가 하나의 일을 하기 위한 방법이 100가지라면 파이썬은 가장 좋은 방법 1가지를 선호한다. 이 파이썬의 간결함이란 철학은 소스코드에도 그대로 적용되어 파이썬 프로그래밍을 하는 사람들은 잘 정리되어 있는 소스코드를 볼 수 있게 되었다. 다른 사람들의 소스 코드가 한눈에 들어오기 때문에 이 간결함은 공동 작업에 매우 큰 역할을 하게 되었다. 다음은 파이썬 프로그램의 예제이다.

# simple.py
languages = ['python', 'perl', 'c', 'java']

for lang in languages:
    if lang in ['python', 'perl']:
        print("%6s need interpreter" % lang)
    elif lang in ['c', 'java']:
        print("%6s need compiler" % lang)
    else:
        print("should not reach here")


위의 프로그램 소스 코드를 이해하려 하지는 말자. 이것을 이해할 수 있다면 당신은 이미 파이썬에 중독된 사람일 것이다.그냥 한번 구경해 보도록 하자. 다른 언어들에서 늘 보이는 단락을 구분하는 괄호({, })문자들이 보이지 않는 것을 확인 할 수 있다. 또한, 줄을 참 잘 맞춘 코드라는 것도 확인 할 수 있다. 줄을 맞추지 않으면 실행이 되지 않는다. 파이썬 프로그래머는 코드를 이쁘게 작성하려고 저렇게 줄맞추어 코딩을 하는것이 아니다. 다만 실행이 되게 하기 위해서 줄을 맞추어야 하는 것이다. 이렇듯 줄을 맞추어 코드를 작성하는 행위는 가독성에 큰 도움을 준다.

 

파이썬으로 할수 있는 것

좋은 프로그래밍 언어와 나쁜 프로그래밍 언어는 이미 정해진 걸까? 그렇다면 어떤것이 최고의 언어일까? 가만히 살펴보면 어떤 언어든지 강한 부분과 약한 부분이 존재한다. 어떤 프로그램을 만들 것인지에 따라 선택해야 할 언어도 달라진다. 한 언어만을 고집하고 그 언어로만 모든 것을 하겠다는 생각은 현실과는 맞지 않는다. 따라서 자신이 만들고자 하는 프로그램을 가장 잘 만들 수 있게 도와주는 언어가 어떤 것인지 알아내고 선택하는 것은 중요한 일이다. 하지만 할 수 있는 일과 할 수 없는 일을 가리기는 쉽지 않다. 왜냐하면 어떤 언어든지 할 수 없는 일은 별로 없기 때문이다. 하지만 한 프로그래밍 언어가 어떤 일에 적합한지에 대해서 아는 것은 매우 중요하다. 따라서 파이썬으로 하기에 적당한 일과 적당하지 않은 일에 대해서 알아보는 것은 매우 가치있는 일이 될 것이다.

파이썬으로 할 수 있는 일은 너무나 많다. 대부분의 컴퓨터 언어가 하는 일을 파이썬은 쉽고 깔끔하게 처리한다. 이것들에 대해서 나열하자면 끝도 없겠지만 대표적인 몇 가지의 예를 들어보도록 하자.

시스템 유틸리티

파이썬은 운영체제(윈도우즈, 리눅스등)의 시스템 명령어들을 이용할 수 있는 도구들을 갖추고 있기 때문에 이러한 것들을 바탕으로 갖가지 시스템 관련한 유틸리티를 만드는 데 유리하다. 여러분은 시스템에서 사용중인 다른 유틸리티성 프로그램들을 하나로 뭉쳐서 큰 힘을 발휘하게 하는 프로그램들을 무수히 만들어 낼 수 있다.

GUI(Graphic User Interface) 프로그램

GUI 프로그래밍이라는 것은 쉽게 말해서 윈도우즈 창같은 프로그램을 만드는 것이다. 파이썬으로 GUI프로그램을 작성하는 것은 다른 언어로 하는 것보다 훨씬 쉽다. 대표적인 것으로 파이썬 프로그램을 설치할 때 함께 설치되는 Tkinter를 들 수 있다. 실제로 Tkinter를 이용한 파이썬 GUI프로그램의 프로그램 소스는 매우 간단하다. 놀라운 사실은 Tkinter를 이용하면 소스코드 단 5줄 만으로도 윈도우즈 창을 띄울 수 있다는 것이다. 이 외에도 wxPython, PyQT, PyGTK등의 Tkinter보다 빠른 속도와 미려한 윈도우 화면을 자랑하는 것들도 있다.

C/C++과의 결합

파이썬은 접착(glue)언어라고도 불리운다. 그 이유는 다른 언어와 함께 잘 어울릴 수 있기 때문이다. C로 만든 프로그램을 파이썬에서 쓸 수 있으며, 파이썬으로 만든 프로그램을 C에서 역시 사용할 수 있다.

웹 프로그래밍

우리는 익스플로러나 크롬, 파이어폭스와 같은 브라우저를 이용하여 인터넷을 사용한다. 누구나 한번쯤 웹 서핑을 하면서 게시판이나 방명록에 글을 남겨 본 적이 있을 것이다. 그러한 게시판이나 방명록을 바로 웹 프로그램이라고 한다. 파이썬은 웹 프로그램을 작성하기에 매우 적합한 도구이며 실제로 파이썬으로 제작된 웹 사이트는 셀 수 없을 정도로 많다.

수치연산 프로그래밍

사실 파이썬은 수치연산 프로그래밍에 적합한 언어는 아니다. 왜냐하면 복잡하고 연산이 많다면 C와 같은 언어로 하는 것이 더 빠르기 때문이다. 하지만 파이썬에서는 Numeric Python이라는 수치 연산 모듈을 제공한다. 이 Numeric Python은 C로 작성되었기 때문에 매우 빠르게 수학연산을 수행한다. 이 모듈을 이용하면 파이썬에서 수치연산을 빠르게 할 수 있다.

데이터베이스 프로그래밍

파이썬은 Sybase, Infomix, Oracle, MySQL, Postgresql등의 데이터 베이스에 접근할 수 있게 해주는 도구들을 제공한다. 또한 이런 굵직한 데이터베이스를 직접 이용하는 것 외에도 파이썬에는 재미있는 함수가 하나 있다. 바로 pickle이라는 모듈이다. 이 모듈은 파이썬에서 쓰이는 자료들을 변형없이 그대로 파일에 저장하고 불러오는 일들을 해 준다.

파이썬으로 할 수 없는 일 

파이썬으로 도스나 리눅스 같은 운영체제, 엄청난 횟수의 반복과 연산을 필요로 하는 프로그램 또는 데이터 압축 알고리즘 개발 프로그램등을 만들기는 어렵다. 즉, 대단히 빠른 속도를 요구하거나 하드웨어를 직접 건드려야 하는 프로그램에는 어울리지 않는다.


장고에서 제공하는 모델을 사용하여 개발할 때, settings.py에 아래와 같이 설정이 되어 있을 것입니다.

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'

USE_I18N = True

USE_L10N = True

USE_TZ = True

pgsql 테이블 내 컬럼 타입이 timestamp without time zone인 것을 테이블 스키마를 장고로 inspectdb를 할 시, DateTimeField로 정의가 됩니다.

그리고 사용자는 해당 컬럼에 대해 datetime.now()와 같이 값을 넣을 때, 문제가 발생합니다.

settings.py 에 정의 된 것처럼, timezone이 서울로 되어 입력이 되어야 하지만, 실제 들어간 데이터를 확인해 보면 UTC기준으로 입력이 됩니다. (또한 RuntimeWarning: DateTimeField received a naive datetime 와 같이 warning을 띄울 수 있습니다.)


이러한 문제를 해결하기 위해, import datetime이 아닌 from django.conf import timezone을 사용하여 timezone.now()를 사용합니다. 또한 settings.py 의 USE_TZ = True부분을 USE_TZ = False로 변경합니다.

이는 https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-USE_TZ 에 나와 있듯이 USE_TZ = True일경우, 장고 내부적으로 시간대를 인식하는 날짜 및 시간을 사용하고 USE_TZ = False일 경우, local time을 사용하게 됩니다. (확인이 필요한 부분이지만 True일 경우, UTC를 기준으로 사용하고 False일 경우, TIME_ZONE에 설정되어 있는 값을 참고하여 local time이 변형됩니다.)

  1. 매드캐스퍼 2018.08.01 12:23

    django.conf 가 아니고 django.utils 인 것 같습니다.

장고 orm이나 파이썬 코드를 보면 *args, **kwargs를 확인할 수 있습니다.

해당 뜻은 어떤 파라미터를 몇개를 받을지 모르는 경우 사용한다 라고 하지만 막연하기 때문에 예를 들어 설명하겠습니다.

*args 

 *args는 파라미터를 몇개를 받을지 모르는 경우 사용하고 튜플 형태로 전달됩니다.

 def test(*args):
    print(args)

test('a','b','c')


#결과 ('a', 'b', 'c')

위처럼 argument로 여러 값을 던지고 해당 함수에서 tuple을 사용할 수 있습니다.


dict타입과 같이 변수 자체를 그대로 넘기면 튜플 내에 데이터 1개로 취급됩니다.

def test(*args):
    print(args)

a = {'name': 'a', 'name2': 'b', 'name3': 'c'}
test(a)


#결과 ({'name3': 'c', 'name': 'a', 'name2': 'b'},)



아래와 같이 dict 변수에 포인터를 붙여서 사용하면 dict 변수내의 키값만 빠져 튜플형태를 이루게 됩니다.

def test(*kwargs):
    print(kwargs)

a = {'name': 'a', 'name2': 'b', 'name3': 'c'}

test(*a)
 
#결과 ('name', 'name2', 'name3')


**kwargs

- 파라미터 명을 같이 보낼 수 있고 kwargs는 딕셔너리 형태로 전달됩니다.

def test(**kwargs):
    print(kwargs)


test(name1='a', name2='b', name3='c')


#결과 {'name2': 'b', 'name3': 'c', 'name1': 'a'}


만약 이미 dict 형태인 값을 가지고 있고, 해당 함수에 변수 자체를 넘기고 싶을 경우 아래와 같이 합니다.


def test(**kwargs):
    print(kwargs)


a = {'name': 'a', 'name2': 'b', 'name3': 'c'}

test(**a)


# 결과 {'name': 'a', 'name2': 'b', 'name3': 'c'}


+ Random Posts