處理引用大表的外來鍵
預設情況下,Django 將 ForeignKey
欄位渲染為 <select>
輸入。如果在引用的表中有數千或數萬個條目,這可能會導致頁面載入速度非常慢。即使你只有數百個條目,在所有條目中查詢特定條目也是非常不舒服的。
一個非常方便的外部模組是 django-autocomplete-light (DAL)。這樣可以使用自動填充欄位而不是 <select>
欄位。
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