list_editable очень медленно при сохранении

Я добавил модель к администратору Django и включил list_editable для определенного поля. Когда я сохраняю изменения, это занимает много времени и в какой-то момент времени ожидания запроса.

Здесь Модель:

class ClientASTM(models.Model):
    client = ForeignKey2(Client, related_name='astms', verbose_name='client')
    day = models.DateField(verbose_name='day')
    last_occurence_date = models.DateField(verbose_name='last occurence', null=True, blank=True)
    search_term = models.CharField(verbose_name='search term', max_length=255)
    is_exclude = models.BooleanField(verbose_name='is exclude', default=False)

    add_datetime = models.DateTimeField(verbose_name='add datetime', auto_now_add=True)
    mod_datetime = models.DateTimeField(verbose_name='mod datetime', auto_now=True)

    def __unicode__(self):
        return u'%s: %s -> %s' % (self.client, self.search_term, self.day)

    class Meta:
        ordering = ('-day',)
        unique_together = (('client', 'day', 'search_term'),)
        verbose_name = 'Client ASTM'

А тут моя модель админа:

class ClientASTMAdmin(admin.ModelAdmin):
    list_editable = (
        'is_exclude',
    )

    list_display = (
        'id',
        'day',
        'search_term',
        'is_exclude'
    )

Это довольно простой, и я не знаю, что это занимает так много времени.

У вас есть идеи, где я мог бы провести расследование ? Или ты знаешь, что я сделал не так ?

Большое спасибо за помощь.

1 ответ

  1. В итоге я заменил list_editable действием администратора. Моя теория заключается в том, что когда вы используете «list_editable», он анализирует каждый отдельный объект. Таким образом, если у вас есть 1 000 000 элементов, он будет анализировать каждый из них.

    Вот мое решение:

    class ClientASTMAdmin(admin.ModelAdmin):
        actions = ('exclude_keyword', )
    
        list_display = (
            'id',
            'day',
            'search_term',
            'is_exclude',
        )
    
        def exclude_keyword(self, request, queryset):
            for instance in queryset:
                instance.is_exclude = not instance.is_exclude
                instance.save()
        exclude_keyword.short_description = 'Exclude (or include) keywords'
    

    Это быстрее, потому что он обновляет только выбранные элементы.