0

我对使用管理员和内联使用中介模型('直通')的m2m字段存在问题。下面的代码:根据django-debug-toolbardjango管理员和内联:多对多与'直通'模式 - 性能问题

# MODELS 

class Engagement(models.Model): 
    parent_engagement = models.ForeignKey('self', blank=True, null=True, related_name='child_engagements') 
    title = models.CharField('Engagement title', max_length=200) 
    ... 
    # client 
    client = models.ForeignKey(Client, related_name='engagements') 
    primary_point_of_contact = models.ForeignKey(
     ClientContact, null=True, blank=True, 
     related_name='engagements_for_which_point_of_contact' 
    ) 
    additional_point_of_contacts = models.ManyToManyField(
     ClientContact, 
     through='AdditionalPointOfContact' 
    ) 
    .... # other fields 


class ClientContact(models.Model): 
    first_name = models.CharField(max_length=200, blank=True) 
    last_name = models.CharField(max_length=200, blank=True) 
    jobtitle = models.CharField(max_length=200, blank=True) 
    company = models.ForeignKey(Client, null=True, blank=True) 


class AdditionalPointOfContact(models.Model): 
    engagement = models.ForeignKey("Engagement", related_name='additional_points_of_contact') 
    client_contact = models.ForeignKey("ClientContact") 
    description = models.CharField(max_length=500, blank=True) 

    def __unicode__(self): 
     return self.client_contact.__unicode__() 



# ADMIN 

class EngagementAdmin(ChaosDefaultAdmin): 
    .... 
    inlines = [ 
     ScopeServiceElementAdmin, 
     AdditionalPointOfContactInlineAdmin 
    ] 
    list_display = (... 


class AdditionalPointOfContactInlineAdmin(admin.TabularInline): 

    model = AdditionalPointOfContact 
    fieldsets = [ 
     ('', { 
      'fields': (('client_contact',), 
         ('description',),) 
     }), 
    ] 

    extra = 0 
    min_num = 0 

,SQL选项卡,说8382个查询,同时注释掉AdditionalPointOfContactInlineAdmin它减少到10个查询,所以有什么不对劲的地方。 我可能会覆盖AdditionalPointOfContactInlineAdmin的get_queryset方法,但我不知道具体如何以及为什么。任何建议?

回答

0

尝试覆盖EngagementAdmin.get_queryset():

class EngagementAdmin(ChaosDefaultAdmin): 
    def get_queryset(self, request): 
     qs = super(EngagementAdmin, self).get_queryset(request) 
     return qs.prefetch_related('additional_points_of_contact') 
     # or 
     # return qs.prefetch_related('additional_points_of_contact__client_contact')