Django version: 1.7
autocomplete_light version: 2.0
I have a many-to-many relationship: Subscription <-> Application, where each Application can belong to multiple Subscriptions and each Subscription can hold multiple Applications. Number of Subscriptions is expected to be in early hundreds, while number Applications is around 1.5 million.
It would be great to use Django Admin to manage Subscriptions and their Applications, and as advised on Stackoverflow to use autocomplete_light for large data sets. Below is the code I came up, however it seams to try to load all 1.5 Million records for AppMetadata at once and hangs the browser. Please, advise.
# model.py
class AppMetadata(models.Model):
package_key = models.IntegerField(primary_key=True)
title = models.CharField(max_length=500)
package = models.CharField(max_length=400)
class Subscription(models.Model):
name = models.CharField(max_length=256, unique=True)
is_active = models.BooleanField('active', default=True)
class SubscriptionApp(models.Model):
subscription_key = models.ForeignKey(to=Subscription, on_delete=models.DO_NOTHING)
package_key = models.ManyToManyField(to=AppMetadata, db_column='package_key')
# autocomplete_light_registry.py
class AppMetadataAutocomplete(autocomplete_light.AutocompleteModelBase):
model = AppMetadata
search_fields = ('title', 'package')
choices = AppMetadata.objects.all()
limit_choices = 20
autocomplete_light.register(AppMetadataAutocomplete)
class SubscriptionAppAutocomplete(autocomplete_light.AutocompleteGenericBase):
model = SubscriptionApp
choices = (
Subscription.objects.all(),
AppMetadata.objects.all(),
)
search_fields = (
('^name', ),
('title', 'package'),
)
limit_choices = 20
autocomplete_light.register(SubscriptionAppAutocomplete)
class SubscriptionAutocomplete(autocomplete_light.AutocompleteModelBase):
model = Subscription
choices = Subscription.objects.all()
search_fields = ('name', )
limit_choices = 20
autocomplete_light.register(SubscriptionAutocomplete)
# admin.py
class SubscriptionAppInline(admin.TabularInline):
model = SubscriptionApp
class SubscriptionAdmin(admin.ModelAdmin):
form = autocomplete_light.modelform_factory(model=Subscription)
inlines = [SubscriptionAppInline]
admin.site.register(Subscription, SubscriptionAdmin)
# settings.py
INSTALLED_APPS = (
'autocomplete_light',
'django.contrib.admin',
...
...
# urls.py
urlpatterns = patterns(
...
# last record
url(r'^autocomplete/', include('autocomplete_light.urls')),
)
I have come-up with a compromise solution. From the code above, I have removed SubscriptionAutocomplete and rewrote admin.py classes as follow:
@admin.register(SubscriptionApp)
class SubscriptionAppAdmin(admin.ModelAdmin):
form = autocomplete_light.modelform_factory(model=SubscriptionApp)
class SubscriptionAppInline(admin.TabularInline):
model = SubscriptionApp
@admin.register(Subscription)
class SubscriptionAdmin(admin.ModelAdmin):
model = Subscription
ordering = ('name',)