2012-08-12 3 views
5

저는 여기서하려고하는 것에 대한 올바른 해결책을 찾기 위해 애 쓰고 있습니다. 정말 도움이됩니다.Django : get_object_or_404 올바른 해결책이 아니지만 무엇입니까?

현재 DB에서 "Special"을 가져와 브라우저에 표시하는 작업 시스템이 있습니다. 사용자는 브라우저에서 "Special"을 편집하여 db에 제출할 수 있습니다. 그런 다음 변경 사항이 사용자에게 표시됩니다.

DB에 기존의 "Special"이 없으면 "Special"이 업데이트되지 않는 것이 문제입니다. 내 views.py에서 나는이 :

def changeSpecialOffer(theRequest): 
    myProductUuid = theRequest.POST['myProductUuid'] 
    myNewSpecialOffer = theRequest.POST['myNewSpecialOffer'] 
    myProduct = get_object_or_404(Product, uuid=myProductUuid) 
    myActiveSpecial = get_object_or_404(SpecialOffer.objects.filter(product=myProduct).filter(
                  active=True)) 
    try: 
     myActiveSpecial.special = myNewSpecialOffer 
     myActiveSpecial.save() 
    except: 
     return HttpResponse(myActiveSpecial, mimetype='text/plain') 
    myActiveSpecial = SpecialOffer.objects.filter(product=myProduct).filter(
                  active=True) 
    return HttpResponse(myActiveSpecial, mimetype='text/plain') 

은 내가 get_object_or_404가 제대로 404 오류를 반환하기 때문에 어떠한 기존의 "특수"없기 때문에 "특별"의 업데이트가 작동하지 않는 이유는 것을 알고 DB에.

DB에 기존 "Special"이있는 경우 함수를 중단하지 않고이 문제를 해결하는 가장 좋은 방법을 찾으려면 잠시 노력해 왔습니다.

지금까지, 나는 tryexcept으로 get_object_or_404를 교체하려고했지만, 나는 다음과 같은 'unicode' has no attribute 'save()'으로 저장 기능 문제로 실행합니다.

myActiveSpecial, just_created = SpecialOffer.objects.get_or_create(product=myProduct, active=True) 

또는이 같은 시도 할 수 :

myActiveSpecial = get_object_or_404(SpecialOffer.objects.filter(product=myProduct).filter(
                active=True)) 

로 :

답변

3

봅니다 대체 당신이 꺼야 단지 .. 더 많은 일을해야하는 경우

try: 
    myActiveSpecial = SpecialOffer.objects.get(product=myProduct, active=True) 
except SpecialOffer.DoesNotExist: 
    myActiveSpecial = SpecialOffer.objects.create(product=myProduct, active=True, ...something.more...) 

을 생성 된 개체.

편집 :

그냥 생각 ... 그것은 HttpResponse에 모델을 보낼 수수께끼 조금입니다. 어쩌면 HttpResponse에 반환 할 문자열을 수동으로 생성하려고 할 것입니다. 물론 현재 코드도 작동합니다. 모델의 __unicode__ 메서드를 암시 적으로 호출합니다.

return 바로 전에 myActiveSpecial을 다시 가져 오는 이유는 무엇입니까? 나는 이것이 어떤 영향을 미치지는 모르겠다.

+0

OK, 그래서 지금은이 : 'myActiveSpecial = SpecialOffer.objects.필터 (제품 = myProduct) .filter ( 활성화 = 참) 반환 HttpResponse에 (myActiveSpecial, 마임 = '텍스트/일반') ' 이 하지만 좀 더 구체적으로 수 원 – Erve1879

+0

라운드 갈 것 같다 "무엇을 갈 않습니다 동그라미에 둥근 "정말 의미? 또한, myActiveSpecial을 다시 가져올 필요가 없다고 생각됩니다. – frnhr

+0

죄송합니다. 기본적으로 특수 기능을 변경하는 JS 함수는 새 값을 올바르게 반환하지만 새 값은 db에 저장되지 않습니다. 페이지를 다시로드하면 이전 스페셜이 표시됩니다. 그런 다음 스페셜을 다시 업데이트하려고하면 새 스페셜을 이전 스페셜에 추가하는 것처럼 보입니다 ...하지만 여전히 저장하지는 않습니다. – Erve1879

0

get_object_or_404 작품 방식은 모델을 전달한 다음 일부 조회를 수행하는 것입니다. SpecialOffer.objects.get()라고 말한 것과 같지만 예외를 발생시키는 대신 404을 발생시킵니다.

처음 제대로 사용했지만 두 번째 인스턴스는 올바르게 사용하지 않았습니다.

대신을 시도해보십시오

myProduct = get_object_or_404(Product, uuid=myProductUuid) # this is correct 
myActiveSpecial = SpecialOffer.objects.filter(product=myProduct).filter(active=True)) 

if myActiveSpecial.count(): 
    # There is one or more active specials! 
else: 
    # There are no active specials for this product 

당신은 또한 역방향 조회 트릭을 사용할 수 있습니다 (귀하의 모델을 설정하는 방법에 따라).

myActiveSpecial = myProduct.specialoffer_set.filter(active=True) 
+1

이 경우에는 myActiveSpecial.exists()가 myActiveSpecial.count()보다 좋을 것이라고 생각합니다. – yprez

관련 문제