2011-03-03 4 views
0

장고 1.2.5 파이썬 : 스포츠 모델의 2.5.5장고 관리 list_display

내 관리자 목록 단지 (400 개 기록으로 5 분) 정말 천천히왔다. 우리가 400 게임, 50 홀수 팀, 2 스포츠가 생길 때까지 2 분 정도 돌아 왔습니다.

나는 그것을 끔찍한 방법으로 고쳐서 누군가가 전에 이것을 보았는지 알고 싶습니다. 내 응용 프로그램은 다음과 같습니다.

models: 

Sport(models.Model) 
    name 

Venue(models.Model) 
    name 

Team(models.Model) 
    name 

Fixture(models.Model) 
    date 
    sport = models.ForeignKey(Sport) 
    venue = models.ForeignKey(Venue) 

TeamFixture(Fixture) 
    team1 = models.ForeignKey(Team, related_name="Team 1") 
    team2 = models.ForeignKey(Team, related_name="Team 2") 


admin: 

TeamFixture_ModelAdmin (ModelAdmin) 
    list_display = ('date','sport','venue','team1','team2',) 

list_display에서 외래 키를 제거하면 빠릅니다. 외래 키를 추가하자마자 느려집니다. 다른 모든 모델

models: 

TeamFixture(Fixture) 
    team1 = models.ForeignKey(Team, related_name="Team 1") 
    team2 = models.ForeignKey(Team, related_name="Team 2") 
    sport_name = "" 
    venue_name = "" 
    team1_name = "" 
    team2_name = "" 

    def __init__(self, *args, **kwargs): 
     super(TeamFixture, self).__init__(*args, **kwargs) 

     self.sport_name = self.sport.name 
     self.venue_name = self.venue.name 
     self.team1_name = self.team1.name 
     self.team2_name = self.team2.name 

admin: 

TeamFixture_ModelAdmin (ModelAdmin) 
    list_display = ('date','sport_name','venue_name','team1_name','team2_name',) 

관리는 수천 순간 기록과 실제의 모든보기에 괜찮 :

나는이 작품 때문에 모델 초기화에서 그들을 아닌 외부 키를 사용하지만, 계산하여 고정 사이트가 정상적으로 작동합니다.

답변

3

제가 먼저 살펴볼 것은 데이터베이스 호출입니다. 이미 설치하지 않았다면 django-debug-toolbar을 설치하십시오. 그 멋진 도구를 사용하면 현재 요청에 대해 수행 된 모든 SQL 쿼리를 검사 할 수 있습니다. 나는 그들 중 많은 수가 있다고 가정한다. 당신이 그들을 보게되면, 당신은 어디서 문제를 찾을 지 알게 될 것입니다.

하나의 문제 나는 내게로 들어갔다. __unicode__ 모델의 메소드가 외래 키를 사용하면 인스턴스 당 하나의 데이터베이스 히트가 발생한다. 이 문제를 극복하기위한 두 가지 방법을 알고 있습니다.

  • select_related을 사용하는 것이 가장 좋은 방법입니다.
  • __unicode__이 정적 문자열을 반환하고 save 메서드를 재정 의하여이 문자열을 적절히 업데이트하십시오.
+0

또한 유니 코드 기능에서 외부 키 유니 코드 기능을 호출 할 수 있습니다. 이로 인해 추가 하위 쿼리가 발생합니다. –

3

그것은 나를 미치게합니다. list_select_related가 True로 설정되어 있지만 list_display에서 User에 외래 키를 추가하면 관리자의 행당 하나의 쿼리가 생성되므로 목록이 느려집니다. Select_related는 True이므로 Django 관리자는 각 행에서이 쿼리를 호출해서는 안됩니다. 무슨 일 이니?

+0

스티브 케이 (Steve K) 나는 똑같은 묶음에 있고 화를 내고있다. –

+1

예, 약 2 년 전에 고쳐졌습니다. 'ModelAdmin'은'select_related()'문을 추가하기 위해'get_queryset' (문서를보세요)을 오버라이드해야합니다. 당신은 당신이 원한다면'only'와'defer' 필드로도 플레이 할 수 있습니다. –

+0

Thankyou @ steve-k 덕택에이 크리스마스에 가족과 함께 할 수 있습니다. –

0

이것은 장고 관리자 및 외래 키의 아주 오래된 문제입니다. 여기서 일어나는 일은 개체를로드하려고 할 때마다 해당 외래 키의 모든 개체를 얻으려고합니다. 그래서 한 팀에 100 개 팀을 포함하여 계속 진행할 팀이 있다고 말하면서 (예를 들어 팀 수는 약 100 개), 몇몇 팀과 함께 조명기를로드하려고합니다. raw_fields이라는 항목을 사용하여 최적화를 시도 할 수 있습니다. 이 작업은 모든 것을 한꺼번에 호출해야하는 대신 호출 수를 제한하고 이벤트가 트리거 될 때 (즉, 팀을 선택할 때만) 호출이 이루어 지도록합니다. 즉 UI를 엉망처럼 조금 보인다면 이 클래스를 사용하여 시도 할 수 있습니다 :

""" 
For Raw_id_field to optimize django performance for many to many fields 
""" 
class RawIdWidget(ManyToManyRawIdWidget): 
    def label_for_value(self, value): 
     values = value.split(',') 
     str_values = [] 
     key = self.rel.get_related_field().name 
     for v in values: 
      try: 
       obj = self.rel.to._default_manager.using(self.db).get(**{key: v}) 
       x = smart_unicode(obj) 
       change_url = reverse(
        "admin:%s_%s_change" % (obj._meta.app_label, obj._meta.object_name.lower()), 
        args=(obj.pk,) 
       ) 
       str_values += ['<strong><a href="%s">%s</a></strong>' % (change_url, escape(x))] 
      except self.rel.to.DoesNotExist: 
       str_values += [u'No input or index in the db'] 
     return u', '.join(str_values) 

class ImproveRawId(admin.ModelAdmin): 
    raw_id_fields = ('created_by', 'updated_by') 
    def formfield_for_dbfield(self, db_field, **kwargs): 
     if db_field.name in self.raw_id_fields: 
      kwargs.pop("request", None) 
      type = db_field.rel.__class__.__name__ 
      kwargs['widget'] = RawIdWidget(db_field.rel, site) 
      return db_field.formfield(**kwargs) 
     return super(ImproveRawId, self).formfield_for_dbfield(db_field, **kwargs) 

그냥 제대로 클래스를 상속 있는지 확인하십시오. 나는 TeamFixture_ModelAdmin (ImproveRawIdFieldsForm)과 같은 것을 추측하고있다. 이것은 대부분 당신에게 당신의 장고 관리에 아주 멋진 성능 향상을 줄 것입니다.

관련 문제