2017-06-14 136 views
1

DB中有很多對象,因此在Admin中搜索非常緩慢。 我有這些模型定義:如何應用索引進行搜索

class Log(models.Model): 
    message = models.TextField(blank=True, null=True) 
    user = models.ForeignKey(AUTH_USER_MODEL, null=True, blank=True) 

class LogEmail(models.Model): 
    log = models.ForeignKey(Log) 
    email = models.CharField(max_length=350, db_index=True) 
    site = models.ForeignKey('sites.Site') 

,這裏是我的ModelAdmin:

class LogAdmin(admin.ModelAdmin): 
    search_fields = ('logemail__email',) 

所以,我有一個電子郵件字段指數LogEmail,我想FK索引默認創建的。我如何加速這件事?我嘗試加入index_together,例如:

class LogEmail(models.Model): 
    log = models.ForeignKey(Log) 
    email = models.CharField(max_length=350, db_index=True) 
    site = models.ForeignKey('sites.Site') 

    class Meta: 
     index_together = (
      ('log', 'email'), 
     ) 

但我沒有注意到任何區別。

回答

0

我注意到與我的網站有類似的問題,並且通過使用相關對象註釋查詢集來避免爲每個對象進行查詢而使速度更快。

from django.db.models import F 

class LogAdmin(admin.ModelAdmin): 
    search_fields = ('email',) 

    def get_queryset(self, request): 
     qs = super(ShipmentAdmin, self).get_queryset(request) 
     return qs.annotate(email=F('logemail__email')) 

    def email(self, obj): 
     return obj.email 
    email.short_description = "Email" 

這增加了查詢的JOIN條款,應有助於加快搜索。