处理引用大表的外键
默认情况下,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