/ / टेम्पलेट में django-fts खोजा मॉडल के लिए विदेशी कुंजी उल्टा - django, sqlite, postgresql, django- टेम्पलेट, psycopg2

टेम्पलेट में django-fts खोजा मॉडल के लिए विदेशी कुंजी उल्टा - django, sqlite, postgresql, django- टेम्पलेट्स, psycopg2

मेरे पास एक विदेशी कुंजी के साथ Django मॉडल की एक जोड़ी है, जिसमें से एक django-fts के साथ खोज करने योग्य है, कहते हैं:

class Foo(models.Model):
...
class Bar(fts.SearchableModel):
foo = models.ForeignKey(Foo)

जब मेरे पास फू का एक उदाहरण है, तो देखने में मैं सम्मिलित कर सकता हूं print foo.bar_set.all() और मुझे परिणामों की एक सरणी दिखाई देती है। हालाँकि अगर मैं इसे किसी भी तरीके से, एक दृश्य में उपयोग करने की कोशिश करता हूँ:

{{foo.bar_set|pprint}}
{{foo.bar_set.all|ppring}}
{{foo.bar_set.count}}
{{foo.bar_set.all|length}}
{% for bar in foo.bar_set.all %} {{bar}} {% endfor %}

और सचमुच कोई निर्माण कि मैं के रूप में व्यवहार के बारे में सोच सकते हैं foo उदाहरण के लिए कोई नहीं था bar_set विशेषता।

संपादित करें: मुझे यकीन है कि मेरे पास एक है Foo उदाहरण में टेम्पलेट, मैंने उम्मीद के मुताबिक काम करने के लिए परीक्षण किया:

{{foo|pprint}}
{{foo.id}} (and any other simple attributes of Foo)

मुझे यकीन है कि संबंधित बार ऑब्जेक्ट हैं, जैसा कि मैं देख रहा हूं कि (print foo.bar_set.all()) का है। और अगर QuerySet खाली था, {{foo.bar_set.all|pprint}} उपज होगा [], नहीं "" (जो यह करता है {{foo.bar_set.all|pprint}}, {{foo.bar_set|pprint}}, और कोई भी {{foo.nonexistent_attribute|pprint}})।

यह व्यवहार तब शुरू हुआ जब मैंने django-fts पूर्ण पाठ खोज का उपयोग करने के लिए Psycopg2 ड्राइवर के साथ SQLite डेटाबेस से PostgreSQL में विकास को स्थानांतरित किया।

मुझे कोई अन्य उत्तर नहीं मिला, क्योंकि गुगली करना बहुत कठिन है: "रिवर्स रिलेशनशिप" या "रिवर्स फॉरेन की" सभी असंबंधित है django.core.urlresolvers.reverse संदर्भ, और मुझे नहीं पता कि Google को "* _set" नाम कैसे दिया जाए। यह कैसे गूगल के रूप में अच्छी तरह से उपयोगी होगा पर एक संकेत है।

उत्तर:

जवाब के लिए 2 № 1

करने के लिए धन्यवाद Marcin Kaszyński"एसओ की मदद से मैं नीचे बग का पता लगाने में कामयाब रहा django-fts बेसमैनगर। Django-fts एक पूर्ण-पाठ खोज इंजन है, जो जोड़ता है .search(query) खोज योग्य कक्षाओं के प्रबंधक के लिए विधि, सह मैं लिख सकता हूं Foo.objects.search("bar")। के लिये सुविधा, यह कहते हैं __call__ प्रबंधक को विधि, जो विरासत में मिली है RelatedManager (जिसका उदाहरण है bar_set)।

टेम्पलेट कोड, में django.templates.Variable._resolve_lookup विधि, देखता है कि bar_set कॉल करने योग्य है (पंक्ति 717), इसे बिना किसी तर्क (लाइन 722) के साथ कॉल करने की कोशिश करता है, और चर को खाली मानता है क्योंकि तर्क आवश्यक थे (लाइनें 724-726)।

Django-fts से __call__ मेथड को हटाकर "BaseManager" मदद करता है।


जवाब के लिए 0 № 2

{{ foo.bar_set.all }} निश्चित रूप से काम करना चाहिए। क्या आप वाकई फू का उदाहरण हैं?


जवाब के लिए 0 № 3

मैं सुझाव देता हूं कि पृष्ठ को रेंडर करने से पहले foo.bar_set.all को एक शब्दकोश तत्व के रूप में देखने का प्रयास करें ताकि आपको वही परिणाम मिल सके।