2013-06-11 3 views
1

주문 지속 수천 개의 그림 레코드 하위 집합이 있으니 taken_date으로 정렬하고 weight 값을 설정하여 순서를 유지해야합니다. 장고 예를 들어정렬 열을 기준으로 테이블과 연속 값으로 설정 다른 열은 그래서 장고 또는 SQL 질문 다음 모델 그러나 내가 가지고이 포즈할지 여부를 확실하지 않다

:

pictures = Picture.objects.filter(album_id=5).order_by('taken_date') 
for weight, picture in enumerate(list(pictures)): 
    picture.weight = weight 
    picture.save() 

이제 기록의 1000 내가 가지고 기대하고 있습니다로, 이것은 너무 오래 걸릴 수 있습니다. 이 작업을 수행하는보다 효율적인 방법이 있습니까? 난 장고가 반드시 데이터베이스 벌크 작업 측면에서 아직 "아직"이 아니라는 것을 배우기 위해 최근에 SQL에 의존 할 필요가 있다고 가정하고 있습니다.

+0

샘플 코드 설정 무게가 현재 값과 같습니까? 아무 것도 실제로 업데이트되는 것을 볼 수 없거나 뭔가 빠졌는가? –

+0

원래의 쿼리 세트와 SQL에서 일련 번호 인 행당 'weight'값을 만들고 원래 레코드에서 전혀 가져 오지 않았고 그 값을'picture.weight'에 적용했습니다. . – DanH

+1

해결책을 자신의 질문에 대한 답변으로 추가하십시오. 이렇게하면 미래에이 질문을 볼 수있는 다른 사람들이 더 명확하게 나타낼 수 있으며 응답을 위/아래로 투표하고 다른 대답과 비교할 수 있습니다. – jcsanyi

답변

1

좋아, 잘 작동하는 MySQL에서 다음을 함께 넣어 봤지만 거기에 장고 ORM을 사용하여 시뮬레이션 할 방법이 없다고 추측하겠습니까?

UPDATE picture p 
JOIN (SELECT @inc := @inc + 1 AS new_weight, id 
FROM (SELECT @inc := 0) temp, picture 
WHERE album_id = 5 
ORDER BY taken_date) pw 
ON p.id = pw.id 
SET p.weight = pw.new_weight; 

나는 6000 개 기록 0.11s 소요 ~에 대해이 해결 굉장한 솔루션 또는 앱이있을 경우를 대비 잠시 동안 열린 그러나 위의 쿼리를 질문을 떠날거야. 당신이 MySQL의에서 다음과 같은 설정이있는 경우 위의 쿼리는 MySQL의에서 경고를 생성합니다

참고는 :

binlog_format=statement 

이 문제를 해결하려면 mixed 또는 row 중 하나에 binlog_format 설정을 변경해야합니다. mixed은 위와 같은 경고를 피하기 위해 row이 필요한 경우를 제외하고는 모두 statement을 사용한다는 것을 의미하므로 아마 더 좋습니다.

+0

이것은 조금 더 빠르게 실행되는 것 같습니다 : UPDATE 페이지 AS m_change 오른쪽 조인 (@i : = @ i + 10을 rank, m.id를 id로 페이지에서 m으로 선택 (SELECT @i : = 0) app = 'somefilter'order by m.sequence asc) AS m_rank ON m_change.id = m_rank.id set sequence = rank; –