'프로그래밍/Python'에 해당하는 글 5건

기존에 사용중인 테이블이 복합키로 구성되어있어서 아래와 같이 모델을 정의하고,


class Task(models.Model):

    batchtaskid = models.CharField(primary_key=True, max_length=20, blank=True)

    userid = models.CharField(primary_key=True, max_length=6, blank=True)

    status = models.CharField(max_length=1, blank=True)

    class Meta:

        db_table = 'task'


업데이트를 하도록 코드를 작성했습니다.

if form.is_valid():

form.cleaned_data['batchtaskid']

            userid = form.cleaned_data['userid']

            status = form.cleaned_data['status']

            task = Task.objects.get(userid=userid, batchtaskid = taskid)

            task.status = status

            task.save()


그 결과 재앙이 일어납니다...

save()를 하는 시점에서 생성되는 쿼리가 아래와 같이 되기 때문입니다.

QUERY = u'UPDATE "task" SET "status" = %s WHERE "task"."userid" = %s '


WHERE 조건에 batchtaskid 와 userid가 AND 조건으로  UPDATE가 실행되는 것을 예상했는데

userid만 들어갔으므로 입력된 userid에 해당되는 모든 레코드의 status가 변경이 되어버립니다.


Django 홈페이지에서 확인해보니 Django에서 복합키를 지원하지 않는다고 합니다.

(https://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys)



따라서 위의 경우 업데이트 로직을 아래와 같이 바꿔서 작성해야 합니다.

if form.is_valid():

            taskid = form.cleaned_data['batchtaskid']

            userid = form.cleaned_data['userid']

            status = form.cleaned_data['status']

            Task.objects.filter(userid=userid, batchtaskid = taskid).update(status=status)


이렇게 구성해야 예상대로 쿼리가 작성되어집니다.

QUERY = u'UPDATE "task" SET "status" = %s WHERE ("task"."batchtaskid" = %s  AND "task"."userid" = %s )'



저작자 표시 비영리 변경 금지
신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

트랙백  2 , 댓글이 없습니다.
secret

django에서 데코레이션이란 기능을 이용하면 view별로 공통 소스를 넣지 않아도 된다.


스프링의 어노테이션하고 비슷하다고 보면 된다.


로그인에서 사용하는 데코레이션 login_required 예제


from django.contrib.auth.decorators import login_required


@login_required(login_url='/accounts/login/')

def my_view(request):

    ...



사용자 정의해서 데코레이션 사용하기


urls.py

from revfactory import views
urlpatterns = patterns('',

    url(r'index/$', views.index),

    url(r'index2/$', views.index2),

)


views.py


두개 이상지정도 가능하다.


from django.http.response import HttpResponse, HttpResponseRedirect



def ipcheck(function=None):

    def _dec(view_func):

        def _view(request, *args, **kwargs):

            ip = request.META.get("REMOTE_ADDR")

 

            if ip != "127.0.0.1":

                print "ok"

                return HttpResponseRedirect('/index2')

            else:

                print "no"

                return view_func(request, *args, **kwargs)

 

        _view.__name__ = view_func.__name__

        _view.__dict__ = view_func.__dict__

        _view.__doc__ = view_func.__doc__

        return _view

 

    if function is None:

        return _dec

    else:

        return _dec(function)

    

def ipcheck2(function=None):

    def _dec(view_func):

        def _view(request, *args, **kwargs):

            ip = request.META.get("REMOTE_ADDR")

 

            if ip == "127.0.0.1":

                print "ok1"

                return HttpResponseRedirect('/index2')

            else:

                print "no2"

                return view_func(request, *args, **kwargs)

 

        _view.__name__ = view_func.__name__

        _view.__dict__ = view_func.__dict__

        _view.__doc__ = view_func.__doc__

        return _view

 

    if function is None:

        return _dec

    else:

        return _dec(function)


@ipcheck

@ipcheck2

def index(request):

    return HttpResponse('welcome')



def index2(request):

    return HttpResponse('bye')



index접속시


[06/Mar/2014 02:49:03] "GET /index2/ HTTP/1.1" 200 3

no

ok1


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret


model선언시 imageField 타입을 지정하니 아래 에러가 나옴

photo = models.ImageField(upload_to='profiles')


 django.core.exceptions.ImproperlyConfigured: Neither Pillow nor PIL could be imported: No module named Image



Image 라이브러리 설치

http://www.pythonware.com/products/pil/



라이브러리 설치할때

Python version 2.7 required, which was not found in the registry

메세지가 나오고 경로 지정이 안된다면


레지스트리 편집기를 열어서 

실행-> regedit


HKEY_LOCAL_MACHINE > SOFTWARE > Python

하위 키들을 아래에 똑같이 구성한다.


HKEY_LOCAL_MACHINE > SOFTWARE > Wow6432Node > Python




저작자 표시 비영리 변경 금지
신고

'프로그래밍 > Python' 카테고리의 다른 글

Django decorators 정의해서 사용하기  (0) 2014.03.06
파이썬 imageField  (0) 2014.02.27
파이썬 한글 인코딩 설정  (0) 2014.02.26
파이썬 cx_Oracle 설치하기  (0) 2014.02.26

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

트랙백이 하나이고 , 댓글이 없습니다.
secret

파일 제일 상단에 아래와 같이 선언


#-*- coding: utf-8 -*-



참고사이트 : http://libsora.so/posts/python-hangul/

저작자 표시 비영리 변경 금지
신고

'프로그래밍 > Python' 카테고리의 다른 글

Django decorators 정의해서 사용하기  (0) 2014.03.06
파이썬 imageField  (0) 2014.02.27
파이썬 한글 인코딩 설정  (0) 2014.02.26
파이썬 cx_Oracle 설치하기  (0) 2014.02.26

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

트랙백이 하나이고 , 댓글이 없습니다.
secret

1. 아래 경로에서 알맞는 파일을 설치 또는 압축해제한다.

http://cx-oracle.sourceforge.net/


윈도우의 경우 설치할때 레지스터 기준으로 설치하겠다고 기본값으로 설치하면 됨


2. 오라클 인스턴트 클라이언트 설치

http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html?ssSourceSiteId=ocomen


경로는 바뀔수 있으니 DownloadInstant Client Downloads 에서 플랫폼에 맞게 받아서 압축을 해제한다.

로그인이 필요함.


압축해한 파일들을 적당한 위치로 이동


PATH와 환경변수 추가 - ORACLE_HOME 을 해당 위치로 지정한다.


python 에서 


import cx_Oracle


이 수행되면 성공




참고 Django에서 오라클 DB설정시

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'xe',
        'USER': 'a_user',
        'PASSWORD': 'a_password',
        'HOST': 'dbprod01ned.mycompany.com',
        'PORT': '1540',
    }
}



저작자 표시 비영리 변경 금지
신고

'프로그래밍 > Python' 카테고리의 다른 글

Django decorators 정의해서 사용하기  (0) 2014.03.06
파이썬 imageField  (0) 2014.02.27
파이썬 한글 인코딩 설정  (0) 2014.02.26
파이썬 cx_Oracle 설치하기  (0) 2014.02.26

WRITTEN BY
RevFactory
REV는 '향상시키다' 의미를 지니고 있습니다. 이곳은 Rev Factory 입니다! Kakao Developer

받은 트랙백이 없고 , 댓글이 없습니다.
secret