У меня есть настройка отношений m2m, и она работает на стороне администратора. однако он перечисляет все 60 000 записей (как и должно быть), чтобы сделать эту работу более эффективной при загрузке, как ограничить количество возвращаемых записей. Я просмотрел параметр list_per_page, чтобы добавить его в admin.py, но, похоже, это работает для списка объектов, мне нужно, чтобы это было в поле multiselect.
Любые идеи?
# models.py
class Sample(models.Model):
sample_id = models.AutoField(primary_key=True)
area_easting = models.IntegerField(choices = EASTING_CHOICES)
area_northing = models.IntegerField(choices = NORTHING_CHOICES)
context_number = models.IntegerField()
sample_number = models.IntegerField()
sample_type = models.CharField(max_length=200, default='', blank=True, null=True, choices = MATERIALS)
weight = models.DecimalField(max_digits=6, decimal_places=2)
description = models.CharField(max_length=500, default='', blank=True, null=True)
recovery_method = models.CharField(max_length=200, default='', blank=True, null=True, choices = RECOVERY_METHODS)
taken_by = models.ForeignKey(settings.AUTH_USER_MODEL, db_column='taken_by', on_delete = models.PROTECT, related_name='depotsample_taken_by')
comments = models.CharField(max_length=1000, default='', blank=True, null=True)
def __str__(self):
return str(self.sample_number)
class Meta:
db_table = 'kap\".\"sample'
#ordering = ["sample_id"]
managed = True
#verbose_name_plural = "samples"
class Container(models.Model):
container_id = models.AutoField(primary_key=True)
container_name = models.CharField(max_length=50, blank=True, null=True)
container_type = models.CharField(max_length=50, blank=True, null=True)
location_id = models.ForeignKey(Location, db_column='location_id', on_delete = models.PROTECT)
samples = models.ManyToManyField('Sample')
icon_desc = models.ForeignKey(Icon, db_column='icon_desc', null=True, blank=True, default='Box',on_delete = models.PROTECT)
def __str__(self):
return self.container_name
Сторона администратора:
# admin.py
class ContainerAdmin(admin.ModelAdmin):
list_display = ('container_name',)
search_fields = ['container_name']
filter_horizontal = ('samples',)
list_per_page = 5 # No of records per page
class SampleAdmin(admin.ModelAdmin):
list_display = ('sample_number',)
search_fields = ['sample_number']
list_per_page = 5 # No of records per page
admin.site.register(Container, ContainerAdmin)
admin.site.register(Sample, SampleAdmin)





Вы можете изменить набор запросов ModelMultipleChoiceField.
class ContainerAdminForm(ModelForm):
class Meta:
model = Container
fields = '__all__'
def __init__(self, *args, **kwargs):
form = super().__init__(*args, **kwargs)
# Limit samples to 10
self.fields['samples'].queryset = Sample.objects.all()[:10]
class ContainerAdmin(admin.ModelAdmin):
list_display = ('container_name',)
search_fields = ['container_name']
filter_horizontal = ('samples',)
form = ContainerAdminForm
Нужна ли вам нумерация страниц или вы можете использовать поиск с автозаполнением? Если это так, вы можете попробовать django-autocomplete-light.readthedocs.io
Я вернулся к этому, я реализовал предложенное решение, но ограничение его до 10 (или любого другого числа) позволяет выбрать только эти 10. С записями ca.60k, как я могу сократить время поиска по всему списку? Я собираюсь посмотреть на автозаполнение дальше.
Спасибо, но я бы предпочел не ограничивать поле множественного выбора, я бы предпочел несколько простых стрелок влево/вправо или что-то подобное для разбиения на страницы набора запросов в поле.