2012-09-11 2 views
1
내가 this에 따라 여러 개체의 slug 필드에서 'blog/' 문자열을 제거 할

와 객체 및 this 문서 :장고 : 업데이트 여러 정규식

>>> import re 
>>> from django.db.models import F 
>>> p = re.compile('blog/') 
>>> Blog.objects.update(slug=p.sub('', F('slug'))) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
TypeError: expected string or buffer 

나는 마지막 문자열로 str()을 추가했는데, 그것은없이 통과 오류 :

>>> Blog.objects.update(slug=p.sub('', str(F('slug')))) 

하지만 모든 개체에 대한 slug 필드에 (DEFAULT:) 삽입합니다.

제안 사항?

답변

2

당신은 그렇게 할 수 없습니다. 업데이트는 데이터베이스 내에서 완벽하게 수행되므로 코드가 아닌 SQL로 변환 할 수 있어야합니다. 반복을 통해 업데이트해야합니다.

for blog in Blog.objects.filter(slug__startswith='blog/'): 
    blog.slug = blog.slug.replace('blog/', '') 
    blog.save() 
+0

답변 해 주셔서 감사합니다. 그런데 내가 왜 그럴 수 없다고하니? [update() method] (https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once)는 SQL로 직접 변환되고' save()'메소드 나 신호로''post_save' 시그널을 출력합니다. 나는 내 코드를 테스트했고're.sub()'를 추가 할 때까지 작동한다. –

+0

음, 정확하게're.sub()'는 파이썬이므로 SQL로 변환 할 수 없습니다. –

+0

듣는 것이 슬프다. 이 코드는 약 15 분 동안 13K 레코드를 반복합니다. 설명해 주셔서 감사합니다. –