2012-08-12 12 views
5

मैं जो भी करने की कोशिश कर रहा हूं उसके लिए मैं सही समाधान तैयार करने के लिए संघर्ष कर रहा हूं और वास्तव में कुछ मदद की सराहना करता हूं।Django: get_object_or_404 सही समाधान नहीं है, लेकिन क्या है?

फिलहाल, मेरे पास एक कार्य प्रणाली है जो डीबी से "विशेष" लेती है और इसे ब्राउज़र में प्रदर्शित करती है। उपयोगकर्ता ब्राउज़र में "विशेष" को संपादित करने और इसे डीबी में सबमिट करने में सक्षम है। उस परिवर्तन को तब उपयोगकर्ता को दिखाया जाता है।

समस्या यह है कि डीबी में कोई पूर्व-मौजूदा "विशेष" नहीं होने पर "विशेष" अपडेट नहीं होगा। मेरी 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 त्रुटि लौटा रहा है डीबी में

मैं इस समस्या को हल किए बिना इस समस्या को हल करने के लिए कुछ समय के लिए प्रयास कर रहा हूं जहां डीबी में मौजूदा "विशेष" है।

अब तक, मैं try और except साथ get_object_or_404 की जगह की कोशिश की है, लेकिन मैं तो इस तरह 'unicode' has no attribute 'save()' के रूप में बचाने के समारोह के साथ समस्याओं, में चलाने। की जगह

उत्तर

3

कोशिश करने के लिए:

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

साथ:

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

या आप कुछ इस तरह की कोशिश कर सकते:

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

अगर आप कुछ बस- साथ बहुत कुछ करने की जरूरत है निर्मित वस्तु।

संपादित करें:

बस एक सोचा ... यह थोड़ा HttpResponse करने के लिए एक मॉडल भेजने के लिए puzzling है। हो सकता है कि आप मैन्युअल रूप से एक स्ट्रिंग बनाना चाहें जिसे आप HttpResponse में वापस करना चाहते हैं। बेशक, वर्तमान कोड भी काम करता है। यह आपके मॉडल के __unicode__ विधि को स्पष्ट रूप से कॉल करता है।

एक और बात - return से पहले myActiveSpecial को फिर से लाने का कारण क्या है? मुझे इसका कोई प्रभाव नहीं दिख रहा है।

+0

ठीक है, तो अब मेरे पास है: 'myActiveSpecial = SpecialOffer.objects।फिल्टर (उत्पाद = MyProduct) .filter ( सक्रिय = सच) वापसी HttpResponse (myActiveSpecial, माइम प्रकार = 'पाठ/सादे') ' लेकिन यह हलकों – Erve1879

+0

में गोल जाने के लिए आप अधिक विशिष्ट हो सकता है लगता है, क्या हो जाता है" सर्किल में गोल "वास्तव में मतलब है? साथ ही, मुझे ऐसा लगता है कि आपको 'myActiveSpecial' को फिर से लाने की आवश्यकता नहीं है। – frnhr

+0

क्षमा करें - बहुत वर्णनात्मक नहीं! असल में, जेएस फ़ंक्शन विशेष रूप से नए मान को सही रूप से बदलने के लिए कार्य करता है, लेकिन नया मान डीबी में सहेजता नहीं है। पृष्ठ को पुनः लोड करने के बाद, पुराना विशेष दिखाया गया है। यदि आप फिर से विशेष अपडेट करने का प्रयास करते हैं, तो ऐसा लगता है कि पुराने विशेष को नए में जोड़ना है ... लेकिन फिर भी बचा नहीं है। – 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.cexists() '' myActiveSpecial.count() 'की तुलना में इस मामले में बेहतर होगा। – yprez

संबंधित मुद्दे