Django admin Add form - ограничение количества отображаемых моделей по внешнему ключу, когда дата находится в пределах диапазона - PullRequest
0 голосов
/ 27 января 2020

Предположим, у меня есть следующая простая модель:

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.

Эта таблица используется многими другими моделями (поэтому 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.
  # ...

My Проблема в том, что таблица DimDate содержит слишком много записей. При использовании Django пользовательского интерфейса администратора для добавления нового экземпляра MyModel в раскрывающемся меню отображаются все мои DimDate, что делает его не удобным для пользователя.

Я сделал быстрый поиск в Google, но не нашел ничего, что могло бы ограничить количество элементов DimDate, извлеченных и отображенных в раскрывающемся меню (при добавлении экземпляра MyModel). Могу ли я отфильтровать свою дату, чтобы включить только даты от 1 месяца в прошлом до 1 месяца в будущем?

Например: если мы 27 января 2020 года. Диапазон дат: [27/12/2019 , 27/02/2020]

В настоящее время я использую подход администратора "classi c" django (без пользовательской формы):

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

Я подозреваю, что мне понадобится переопределить форму MyModel. Но даже делая это. Как я могу ограничить количество извлеченных DimDate внутри моей формы?

Есть ли более простой способ сделать (как я новичок с Django ...)?

В случае, если это необходимо, я использую Django 2.2.6

1 Ответ

2 голосов
/ 27 января 2020

используйте raw_id_fields в вашей конфигурации администратора, чтобы предотвратить загрузку всех объектов

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

он отображается как показано ниже, и вы можете выбрать объект, нажав на него в новом окне enter image description here

и, если вы хотите просто отфильтровать выпадающие элементы, вы можете добавить 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.
  # ...
...