2010-07-21 13 views
18

मैं ओआरएम के माध्यम से एक django अद्यतन चलाने के लिए चाहता हूं जो इस तरह कुछ दिखता है:क्या मैं स्ट्रिंग कॉन्सटेनेशन के साथ Django F() ऑब्जेक्ट्स का उपयोग कर सकता हूं?

MyModel.objects.filter(**kwargs).update(my_field=F('my_other_field')+'a string') 

यह MySQL को अपवाद फेंकने का कारण बनता है। क्या कच्चे एसक्यूएल लिखने के बिना ऐसा करने के लिए वैसे भी है?

उत्तर

25

बात ये है कि Django एसक्यूएल करने से गुजर रहा है '+' है - लेकिन एसक्यूएल संयोजन के लिए '+' के उपयोग की अनुमति नहीं है, तो यह संख्या जोड़ने के लिए कोशिश करता है। आप 'एक स्ट्रिंग' के स्थान पर एक पूर्णांक उपयोग करते हैं, यह भावना में काम करते हैं कि यह आपके चर को my_other_field का पूर्णांक मान कहते है।

यह है कि क्या यह एक बग है यह बहस का मुद्दा है। documentation for F() objects देखने प्रश्नों में कहा गया है:

Django F() वस्तुओं

तो यह तर्क दिया जा सकता है कि आप की कोशिश नहीं की जानी चाहिए साथ इसके अलावा, घटाव, गुणा, विभाजन और सापेक्ष गणित के उपयोग का समर्थन तारों के साथ अद्यतन करने के लिए इसका इस्तेमाल करें। लेकिन यह निश्चित रूप से दस्तावेज नहीं है, और त्रुटि संदेश 'गलत डबल मूल्य' बहुत उपयोगी नहीं है। मैं टिकट खोलूंगा

+0

विस्तृत प्रतिक्रिया – Zach

+0

SQLite में करने के लिए धन्यवाद यह भी कम उपयोगी है: यह सिर्फ पाठ करने के लिए "0" कायम की है! – boxed

24

मैं ने वही समस्या थी, मूल रूप से मैं उपयोगकर्ता के पूर्ण नाम प्राप्त करने के लिए दो फ़ील्ड को जोड़ना चाहता था। मैं इसे इस तरह से हल मिल गया है (लेकिन कहना होगा कि मैं Postgres उपयोग कर रहा था):

from django.db.models.functions import Concat 
from django.db.models import F, Value, CharField 

AnyModel.objects.filter(**kwargs).annotate(full_name=Concat(F('model__user_first_name'), Value(' '), F('model__user_last_name'), output_field=CharField())) 

जहां, एफ ('...') एक प्रश्न के रूप में अपनी तर्क, मूल्यांकन करता है, ताकि आप के एक क्षेत्र को क्वेरी कर सकते हैं मॉडल ही, या अवधि मॉडल आप/फिल्टर में क्या मिलेगा के रूप में भर में है, जबकि मूल्य ('...') अपने तर्क सचमुच का मूल्यांकन करता है (मेरे मामले में मैं एक जगह की जरूरत first_name और last_name के बीच में रखा जाना करने के लिए), और output_field = ... एनोटेट क्षेत्र (मैं एक CharField बनना चाहता था) का प्रकार निर्दिष्ट करता है। अधिक जानकारी के लिए, आप Django docs about Concat

उम्मीद कर सकते हैं कि यह किसी के लिए सहायक होगा। चीयर्स

+0

यह एक उत्कृष्ट उत्तर है जो उम्मीद के अनुसार काम करता है। – ihhcarus

+0

यह एक अच्छा उत्तर है जो अपेक्षा के अनुसार काम करता है। –

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

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