मैं कुछ डेटाबेस ऑब्जेक्ट्स को एक समेकित स्ट्रिंग द्वारा फ़िल्टर करना चाहता हूं।डीजेगो ओआरएम: अतिरिक्त विशेषता द्वारा फ़िल्टर
सामान्य SQL क्वेरी होगा:
SELECT concat(firstName, ' ', name) FROM person WHERE CONCAT(firstName, ' ', name) LIKE "a%";
मॉडल में, मैं बनाया है एक प्रबंधक PersonObjects कहा जाता है:
class PersonObjects(Manager):
attrs = {
'fullName': "CONCAT(firstName, ' ', name)"
}
def get_query_set(self):
return super(PersonObjects, self).get_query_set().extra(
select=self.attrs)
मैं भी अपने मॉडल में यह कॉन्फ़िगर किया:
objects = managers.PersonObjects()
अब पूर्ण वस्तुओं तक पहुंच एकल वस्तुओं के लिए काम करता है:
>>> p = models.Person.objects.get(pk=4)
>>> p.fullName
u'Fred Borminski'
लेकिन यह एक फिल्टर में काम नहीं करता:
>>> p = models.Person.objects.filter(fullName__startswith='Alexei')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/django/db/models/manager.py", line 141, in filter
return self.get_query_set().filter(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 550, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 568, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1128, in add_q
can_reuse=used_aliases)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1026, in add_filter
negate=negate, process_extras=process_extras)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1191, in setup_joins
"Choices are: %s" % (name, ", ".join(names)))
FieldError: Cannot resolve keyword 'fullName' into field. Choices are: firstName, gender, name, (...)
यह एक बग या एक विशेषता है? मैं इसे कैसे ठीक करूं?
धन्यवाद।
दुर्भाग्य से यह काम नहीं करता है। यह अभी भी पूर्णनाम विशेषता नहीं ढूंढने के बारे में शिकायत करता है। ऑब्जेक्ट से पूर्णनाम विशेषता को पुनर्प्राप्त करना हालांकि काम करता है। क्या यह 'अतिरिक्त' विधि किसी भी तरह से प्रबंधक से पहले सेट अतिरिक्त विशेषताओं को ओवरराइट करता है? –
असल में यह या तो काम नहीं करता है: 'models.Person.objects.extra (select = {' fullName ': "CONCAT (firstName,' ', name)"}, जहां = [' fullName LIKE% s '], पैरा = ['एलेक्सी%']) '(यह' अज्ञात कॉलम 'फुलनाम' को 'जहां खंड' में फेंकता है " –
मुझे ट्रिपल टिप्पणी के लिए खेद है। इस व्यवहार का कारण यह है कि डैंजो निश्चित रूप से पूर्णनाम को पास करता है उपनाम, जो MySQL के साथ काम नहीं करता है। यह 'हैविंग'-क्लॉज में काम करेगा, लेकिन ऐसा लगता है कि Django द्वारा समर्थित नहीं है। इसके बजाय, मैं निम्नलिखित (बहुत सुंदर नहीं) समझौता का उपयोग कर रहा हूं: 'मॉडल। Person.objects.extra (जहां = ["CONCAT (firstName, '', नाम) पसंद% s"], पैराम्स = ['Alexei%'])। आपके उत्तर के लिए धन्यवाद। –