删除django admin的ForeignKey字段默认的select



User模型中有150k个条目。当我在django-admin中使用它而没有raw_id_fields时,它会导致问题,同时将所有条目加载为外键的选择菜单。是否有其他方法可以使它易于加载或可搜索?

我有上面定义的这些模型,并且有一个User模型在profilerrecommendation模型中用作ForeignKey。用户模型的数据库条目由大约150k个条目组成。我不需要这些外部字段的默认选择选项。相反,它可以过滤掉它们,只加载用户表的少数条目。我怎样才能使它们像自动补全建议一样可搜索?

admin.py

class ProfileRecommendationAdmin(admin.ModelAdmin):
list_display = ('user', 'recommended_by', 'recommended_text')
raw_id_fields = ("user", 'recommended_by')
search_fields = ['user__username', 'recommended_by__username',]
admin.site.register(ProfileRecommendation, ProfileRecommendationAdmin)

models.py

class ProfileRecommendation(models.Model):
user = models.ForeignKey(User, related_name='recommendations')
recommended_by = models.ForeignKey(User, related_name='recommended')
recommended_on = models.DateTimeField(auto_now_add=True, null=True)
recommended_text = models.TextField(default='')

您可以使用formfield_for_foreignkey方法

像这样:

class ProfileRecommendationAdmin(admin.ModelAdmin):

   def formfield_for_foreignkey(self, db_field, request, **kwargs):
     if db_field.name == "user":
       kwargs["queryset"] = User.objects.filter(is_superuser=True)
     return super(ProfileRecommendationAdmin,self).formfield_for_foreignkey(db_field, request, **kwargs)

或其他方法是重写modeladmin类

的表单
from django import forms
from django.contrib import admin
from myapp.models import Person
class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        exclude = ['name']
class PersonAdmin(admin.ModelAdmin):
    exclude = ['age']
    form = PersonForm

您可以更改小部件,并使用像自动完成和ajax的选择。

最新更新