处理引用大表的外键

默认情况下,Django 将 ForeignKey 字段渲染为 <select> 输入。如果在引用的表中有数千或数万个条目,这可能会导致页面加载速度非常慢。即使你只有数百个条目,在所有条目中查找特定条目也是非常不舒服的。

一个非常方便的外部模块是 django-autocomplete-light (DAL)。这样可以使用自动填充字段而不是 <select> 字段。

StackOverflow 文档

views.py

from dal import autocomplete

class CityAutocomp(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = City.objects.all()
        if self.q:
            qs = qs.filter(name__istartswith=self.q)
        return qs

urls.py

urlpatterns = [
    url(r'^city-autocomp/$', CityAutocomp.as_view(), name='city-autocomp'),
]

forms.py

from dal import autocomplete

class PlaceForm(forms.ModelForm):
    city = forms.ModelChoiceField(
        queryset=City.objects.all(),
        widget=autocomplete.ModelSelect2(url='city-autocomp')
    )

    class Meta:
        model = Place
        fields = ['__all__']

admin.py

@admin.register(Place)
class PlaceAdmin(admin.ModelAdmin):
    form = PlaceForm