Django admin 添加表单 - 当日期在范围内时通过外键限制显示模型的数量

Django admin Add form - Limit number of displayed Model by foreign key when date is within range

假设我有以下简单模型:

class Dimdate(models.Model):
  id = models.AutoField(db_column='Id', primary_key=True)  # Field name made lowercase.
  date = models.DateField(db_column='date')  # Field name made lowercase.

这个table被许多其他模型使用(所以Dimdate.id是FK)如下:

class MyModel(models.Model):
  id = models.AutoField(db_column='Id', primary_key=True)  # Field name made lowercase.
  dateid = models.ForeignKey(Dimdate, models.DO_NOTHING, db_column='DateId', blank=True, null=True)  # Field name made lowercase.
  # ...

我的问题是 DimDate table 包含太多记录。当使用 Django admin UI 添加新的 MyModel 实例时,下拉菜单显示了我所有的 DimDate,这使得它对用户不友好。

我进行了快速 google 搜索,但没有发现任何东西可以限制在下拉菜单中检索和显示的 DimDate 元素的数量(添加 MyModel 实例时)。 我可以过滤我的 dimdate 以仅包含从过去 1 个月到未来 1 个月的日期吗?

例如:如果我们是 2020 年 1 月 27 日。日期范围是:[27/12/2019, 27/02/2020]

我目前正在使用 django 的管理 "classic" 方法(无自定义表单):

@admin.register(models.MyModel)
class MyModelAdmin(admin.ModelAdmin):

我怀疑我需要覆盖 MyModel 表单。但即使这样做。如何限制我的表单中检索到的 DimDate 的数量?

有没有更简单的方法(因为我是 Django 的新手...)?

如果需要,我使用的是 Django 2.2.6

在您的管理配置中使用 raw_id_fields 来防止加载所有对象

@admin.register(models.MyModel)
class MyModelAdmin(admin.ModelAdmin):
    raw_id_fields = ('dateid',)`

它显示如下,您可以 select 在新 window 上单击它时反对

如果您只想过滤下拉项目,您可以将 limit_choices_to 添加到您的外键字段,如下所示:

def limit_dim_date_choices():
    return {'date__range': (date(2019,12,27), date(2020,2,27))}

class MyModel(models.Model):
  id = models.AutoField(db_column='Id', primary_key=True)  # Field name made lowercase.
  dateid = models.ForeignKey(Dimdate, limit_choices_to=limit_dim_date_choices, models.DO_NOTHING, db_column='DateId', blank=True, null=True)  # Field name made lowercase.
  # ...