2009-07-23 2 views
1
나는 간단한 django의 쿼리를 다음과 같이 설정했다 : 다음과 같이 사용하고 싶다 : 그러나 마지막 문장은 다음과 같다. "일단 슬라이스가 오면 쿼리를 업데이트 할 수 없다. 찍은. " 쿼리 세트를 복제하려면 어떻게해야합니까?

답변

2

qs [0 : 3] .update()를 수행 할 수 없으므로 오류가 발생하는 첫 번째 줄입니다. qs [0 : 3]이 슬라이스를 취하고 있습니다. update()가 쿼리를 업데이트합니다.

업데이트는()

UPDATE app_model SET state = 'F' WHERE state <> 'F'; 

당신은 "순서"에 따라 처음 세 항목을 업데이트하려는 것처럼 SQL 쿼리의 결과로 대량 업데이트위한 것입니다,하지만이 함께 할 수 없습니다 UPDATE 유형 - SQL UPDATE를 주.하거나 제한 할 수 없습니다. 다르게 써야합니다.

UPDATE app_model SET state = 'F' WHERE id IN (
    SELECT id FROM app_model WHERE state <> 'F' ORDER BY order LIMIT 3 
) AS sub; 

그러나 장고는이를 수행 할 수 없습니다.

0

쿼리 세트의 조각을 만들고 이전에 업데이트를 사용할 수 있도록하는 방법에 대한 이야기가 있지만 AFAIK는 아직까지 아무 것도 제작되지 않았습니다. 나는 당신이 queryset의 조각을 복사 할 수 있다고 생각하지 않지만,이 경우에 당신은 필요가 없다. 주문이 고유 한 정수 인 경우,이 할 수있을 것입니다 : 내가 원하지 않는 요소를 제거하기 위해 제외 사용

qs = AModel.objects.exclude(state="F").order_by("order") 
if len(qs) > 3: 
    slice = qs.exclude(order__gt=qs[3]) 
else: 
    slice = qs 
slice.update(state='F') 

,하지만 순서가 고유 한 경우에만 당신은 늘 알 수있을, 다른 작동합니다 얼마나 많은 업데이 트하십시오. 경우 순서가 고유하지 않습니다 그것은 여전히 ​​위해 두 번째 독특한 인수를 사용하는 것이 가능할 것이다 :

qs = AModel.objects.exclude(state="F").order_by("order", "pk") 
if len(qs) > 3: 
    slice = qs.exclude(order__gt=qs[3]).exclude(order=qs[3], pk__gt=qs[3]) 
... 
+0

참고이 경우에도 트랜잭션에, 비 원자이다 (최소한 Postgres에서), 당신이 먼저 테이블 잠금을 해제하지 않는 한. –

+0

qs.all()을 사용하여 쿼리 세트를 복사 할 수 있지만 여기서는 도움이되지 않습니다. –

+0

내가 QuerySet의 일부를 복사하여 새로운 것을 실행하여 업데이트를 실행할 수 있음을 의미합니다. 명확한 답변. – googletorp

1

당신은이 작업을 수행 할 수 있습니다

qs = AModel.objects.filter(id__in= AModel.objects.exclude(state="F").order_by("order")[10]).update()