2017-03-20 3 views
0

이에서 오브젝트를 제거 예상되지 않은 행동 :장고의 검색어 업데이트 방법의 검색어

items = Item.objects.filter(sent=False) 

items.count() # 3 

items.update(sent=True) 

items.count() # 0 

방법의 검색어에서 그들을 잃어버린없이 개체를 업데이트 할?

+0

그게 정확한 코드예요? 'items = items.update (sent = True)'와 같은 것을하지 않습니까? –

+0

@JensAstrup ye,이 코드는 입니다. items.update (sent = True)'int를 반환합니다 : 3 - 숫자 행에 영향을 받았습니다. – MaxCore

+0

나는 내 자신의 코드와 비슷한 것을 실행하고'update() '(예상했던대로) queryset에는 영향을 미치지 않았다. 여기에 무슨 일이 일어나고 있는지 확실하지 않습니다 ... –

답변

2

.count()을 실행할 때마다 다른 쿼리를 수행하고 있습니다.

예상되는 동작입니다. 업데이트를 수행하기 전에 sent=False의 개체가 있고 그 이후에는 아무 것도 표시되지 않습니다.

결과를 유지하려면 변수에 그 결과를 저장해야합니다.

items_count = items.count() 

너무 많은 항목을 다루지 않으면이 문제에 대한 잠재적 해결책은 쿼리 세트를 나열하는 것입니다.

items = list(Item.objects.filter(send=False) 
len(items) # 3 
Item.objects.filter(send=False).update(send=True) 
len(items) # 3 

이것은 물론 않습니다 (하지만 당신을 더 이상 내가 .count() 대신 len를 사용했다 왜. 이것은 당신도 업데이트 후 모델을 사용할 수 있지만 의미 하는가 방법을 (검색어 세트에 액세스 할 수 없습니다 의미 send 여전히 False로 설정됩니다)

검색어 세트는 모델의 하지 된 목록 인 것을 기억 그것은의 표현 - 당신은 이런 식으로하고있는 경우가 오래된 경우 상대하고 있음을 기억해야합니다. 쿼리를 반복하여 결과를 얻을 수 있습니다.

+1

"변수들을 잡아라."내가 여기있는 줄 알았다.'items = Item.objects.filter (sent = False)':) – MaxCore

+0

답변에 더 많은 것을 추가했습니다. 모델리스트가 아닌 쿼리 세트에 유의하십시오. – Shadow

+0

@MaxCore이 동작에 대한 추가 설명이 필요하면 알려 주시기 바랍니다. 그렇지 않은 경우이 대답을 확인해보십시오. – Shadow