處理引用大表的外來鍵

預設情況下,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