2016-11-30 23 views
6

मैं नीचे के रूप में एक डाटा मॉडल है प्रश्नों की संख्या कैसे अनुकूलित करें:जब Django में raw_id_fields का उपयोग कर व्यवस्थापक

class Candidate(models.Model): 
    name = models.CharField() 

class Skill(models.Model): 
    name = models.CharField() 

class CandidateSkill(models.Model): 
    candidate = models.ForeignKey(Candidate) 
    skill = models.ForeignKey(Skill, related_name='candidate_skills') 
    proficiency = models.CharField() 

और व्यवस्थापक में मेरे पास है:

class CandidateSkillInline(admin.TabularInline): 
    model = CandidateSkill 
    fields = ('skill',) 
    extra = 0 
    raw_id_fields = ('skill',) 

class CandidateAdmin(admin.ModelAdmin): 
    model = Candidate 
    fields = ('name',) 
    inlines = [CandidateSkillInline] 

प्रत्येक उम्मीदवार कई कौशल हो सकता है । यहां समस्या यह है कि प्रत्येक इनलाइन के लिए परिवर्तन पृष्ठ में एक प्रश्न कौशल (SELECT ••• FROM "skill" WHERE "skill"."id" = <id>) लाने के लिए उपयोग किया जाएगा। यदि मैं CandidateSkillInline में read_only के रूप में फ़ील्ड जोड़ता हूं तो अतिरिक्त प्रश्न नहीं होंगे। हालांकि मैं इनलाइनों में नए आइटम जोड़ने में सक्षम होना चाहता हूं। बात मैं कोशिश की है:

1) कस्टम CandidateSkillInline को formset कहा:

def get_queryset(self, request): 
    super(CandidateSkillInline, self).get_queryset(request).select_related('skill') 

3) ओवरराइड get_querysetCandidateAdmin पर:

class CandidateSkillInlineFormset(BaseInlineFormSet): 
    def __init__(self, *args, **kwargs): 
     super(CandidateSkillInlineFormset, self).__init__(*args, **kwargs) 
     self.queryset = self.queryset.select_related('skill') 

2) इनलाइन पर get_queryset ओवरराइड

def get_queryset(self, request): 
    return super(CandidateAdmin, self).get_queryset(request).prefetch_related('candidate_skills__skill') 

हालांकि, मुझे अभी भी मिलता है प्रत्येक कौशल के लिए एक प्रश्न। प्रश्नों को नहीं भेजा जाने का एकमात्र तरीका यह है कि जब मैं skillread_only_fields में उम्मीदवार स्किलइनिल में सेट करता हूं। सवाल यह है कि मैं प्रत्येक इनलाइन के लिए एक क्वेरी में कौशल का चयन या प्रीफेच कैसे कर सकता हूं?

+0

कृपया एक स्पष्टीकरण कृपया। आप कहते हैं, "प्रत्येक उम्मीदवार के पास कई कौशल हो सकते हैं" लेकिन यहां मॉडलिंग किया जा रहा है, बहुत से रिश्ते हैं (Django के ManyToManyField के स्पष्ट उपयोग के बिना) – e4c5

+0

@ e4c5 मैंने अधिक स्पष्टीकरण के लिए मॉडल को अपडेट किया है। मुझे प्रत्येक कौशल के लिए 'प्रवीणता' को स्टोर करने की ज़रूरत है, इसलिए कई – Nasir

+0

एचएम की आवश्यकता है, केवल एक ही बदलाव है जिसे मैं देखता हूं कि नाम फ़ील्ड प्रवीणता में बदल रहा है, जो अभी भी इसे कई 'उम्मीदवार' के माध्यम से उम्मीदवारस्किल – e4c5

उत्तर

1

ऐसा लगता है कि आप अपने ManyToManyField को लागू करने की कोशिश कर रहे हैं। क्या आप इसके बजाय ManyToManyField और इनलाइन का उपयोग कर सकते हैं? यह व्यवस्थापक में एक अच्छा बहु-चयन विजेट है।

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-many-to-many-models

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