기존에 사용중인 테이블이 복합키로 구성되어있어서 아래와 같이 모델을 정의하고,
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 )'
'백엔드기술 > 개발언어' 카테고리의 다른 글
Java 버젼별 비교 정리 (0) | 2015.03.30 |
---|---|
Django decorators 정의해서 사용하기 (0) | 2014.03.06 |
파이썬 imageField (0) | 2014.02.27 |