Django - विदेशी प्रमुख गुणों पर फ़िल्टरिंग


105

मैं एक विशेष क्षेत्र के मूल्य के आधार पर Django में एक तालिका को फ़िल्टर करने का प्रयास कर रहा हूं ForeignKey

उदाहरण के लिए, मेरे पास दो मॉडल हैं:

class Asset(models.Model):
    name = models.TextField(max_length=150)
    project = models.ForeignKey('Project')

class Project(models.Model):
    name = models.TextField(max_length=150)

मैं संबंधित परियोजना के नाम के आधार पर अपनी संपत्ति सूची को फ़िल्टर करना चाहता हूं।

वर्तमान में, मैं दो प्रश्न कर रहा हूं :

project_list = Project.objects.filter(name__contains="Foo")
asset_list = Asset.objects.filter(desc__contains=filter,
                                  project__in=project_list).order_by('desc')

मैं सोच रहा था कि क्या मुख्य क्वेरी में इस तरह के फ़िल्टरिंग को निर्दिष्ट करने का कोई तरीका है?

जवाबों:


167

Asset.objects.filter( project__name__contains="Foo" )


1
धन्यवाद, मैंने कोशिश की थी, लेकिन जाहिर है कि मैं डबल अंडरस्कोर का उपयोग करना भूल गया था।
फ्रेजर ग्राहम

3
आवश्यक है ??
डेडडजंगो जोकर

@DeadDjangoDjoker containsक्वेरी में उपयोग की जाने वाली तुलना के प्रकार का वर्णन करता है जो django ORM उत्पन्न करता है, sql संभवतः जैसा दिखेगा LIKE '%Foo%'
orangecaterpillar

17

यह संभव हुआ है क्योंकि queryset-refactorशाखा प्री-1.0 से उतरा है। टिकट 4088 ने समस्या को उजागर किया। यह काम करना चाहिए:

Asset.objects.filter(
    desc__contains=filter,
    project__name__contains="Foo").order_by("desc")

Django कई-टू-वन प्रलेखन इस और विदेशी कुंजी निम्नलिखित मॉडल एपीआई का उपयोग कर के अन्य उदाहरण है।


1
क्या यह दो बार DB को हिट करने वाला है, क्या मुझे इसे और अधिक इष्टतम बनाने के लिए select_related () का उपयोग करना चाहिए?
फ्रेजर ग्राहम

5
आप एक .query.as_sql () जोड़कर देख सकते हैं कि sql वास्तव में क्या निष्पादित किया जाएगा।
फास्टमूलिपिलेशन

django डॉक्स का लिंक पूरी तरह से पुराना है और '410 पृष्ठ हटाए जाने' पर भूमि: - /
szeitlin

0
student_user = User.objects.get(id=user_id)
available_subjects = Subject.objects.exclude(subject_grade__student__user=student_user) # My ans
enrolled_subjects = SubjectGrade.objects.filter(student__user=student_user)
context.update({'available_subjects': available_subjects, 'student_user': student_user, 
                'request':request, 'enrolled_subjects': enrolled_subjects})

ऊपर दिए गए मेरे आवेदन में, मैं मानता हूं कि एक बार एक छात्र को नामांकित करने के बाद, एक विषय SubjectGrade उदाहरण बनाया जाएगा जिसमें विषय में नामांकित और छात्र स्वयं / खुद शामिल होंगे।

विषय और छात्र उपयोगकर्ता मॉडल विषय के लिए एक विदेशी कुंजी है मॉडल।

"Available_subjects" में, मैंने उन सभी विषयों को बाहर कर दिया है, जो पहले से ही वर्तमान छात्र_युजर द्वारा नामांकित हैं, सभी "छात्र" के पास वर्तमान छात्र_युसर के रूप में विशेषता वाले सभी विषय-वस्तु उदाहरण की जाँच करके।

पुनश्च। यदि आप अभी भी मेरे स्पष्टीकरण के कारण समझ नहीं सकते हैं तो अग्रिम में माफी। यह सबसे अच्छा स्पष्टीकरण है जो मैं प्रदान कर सकता हूं। बहुत बहुत धन्यवाद


मुझे लगता है कि इसे संदर्भ में रखने के लिए कोड के ब्लॉक में कुछ पाठ, स्पष्टीकरण या टिप्पणी को संपादित करना और टिप्पणी करना बहुत अच्छा होगा।
एलिशा सेनू

मैं एक स्पष्टीकरण प्रदान करता हूं। धन्यवाद @ElishaSenoo
किनोवे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.