【问题标题】:ForeignKey Field in django admindjango admin 中的 ForeignKey 字段
【发布时间】:2016-09-11 22:53:47
【问题描述】:

用户模型中有大约 15 万个条目。因此,当我在没有 raw_id_fields 的 django-admin 中使用它时,在将所有条目加载为外键的选择菜单时会导致问题。 是否有其他方法可以轻松加载或可以搜索。

基本上我有上面定义的这些模型,并且有一个用户模型用作 ProfileRecommendation 模型中的 ForeignKey。因此用户模型的数据库条目包含大约 1,50,000 个条目。我不希望这些外国字段的默认选择选项。相反,如果可以将它们过滤掉并仅加载用户表的少数条目。或者无论如何我可以让它们像自动完成建议一样可搜索

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='')

【问题讨论】:

  • PLS描述问题并问清楚问题
  • 基本上我有上面定义的这些模型,并且有一个用户模型用作 ProfileRecommendation 模型中的 ForeignKey。因此用户模型的数据库条目包含大约 1,50,000 个条目。我不希望这些外国字段的默认选择选项。相反,如果可以将它们过滤掉并仅加载用户表的少数条目。或者无论如何我可以让它们像自动完成建议一样可搜索。

标签: python django django-forms django-admin


【解决方案1】:

我推荐你使用django-select2-forms

使用该包,您可以如下定义模型外部字段:

from select2.fields import ForeignKey

class Author(models.Model):
  name = models.CharField(max_length=100)
  active = models.BooleanField()

class Entry(models.Model):
    author = ForeignKey(Author,
    limit_choices_to=models.Q(active=True),
    ajax=True,
    search_field='name',
    overlay="Choose an author...",
    js_options={
        'quiet_millis': 200,
    },
    on_delete=models.CASCADE)

在 django admin 中,这将使用 ajax 加载作者的姓名,这应该比使用默认的 admin ForeignKey 字段更快。此外,从示例中可以看出,您可以使用 limit_choices_to 过滤仅需要的可供选择的值。

如果不是 django-select2-forms,您可以使用任何其他可用于 django 自动完成的包:list of autocomplete packages here

我从列表中尝试了几个,但 django-select2-forms 看起来最适合我。

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 2013-05-23
    • 2011-07-03
    • 2012-09-21
    • 1970-01-01
    • 2017-01-22
    • 2014-05-15
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多