【问题标题】:Django Admin list_per_page for a multichoicefield m2m多选字段 m2m 的 Django Admin list_per_page
【发布时间】:2020-09-02 18:57:30
【问题描述】:

我有一个 m2m 关系设置,它适用于管理方面。但是,它列出了所有 60,000 条记录(应该如此),以便在加载时更有效地完成这项工作。如何限制返回记录的数量。我已经查看了添加到 admin.py 的 list_per_page 选项,但这似乎适用于对象列表,我需要在多选字段中使用它。

有什么想法吗?

# 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)

【问题讨论】:

    标签: django pagination many-to-many multichoiceitems


    【解决方案1】:

    您可以修改 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 记录,如何使搜索整个列表变得高效?我将进一步研究自动完成功能。
    猜你喜欢
    • 2015-09-29
    • 2019-03-26
    • 2011-03-07
    • 2018-07-28
    • 2014-01-02
    • 2016-02-23
    • 1970-01-01
    • 2013-02-05
    • 2019-04-15
    相关资源
    最近更新 更多