【问题标题】:Django list_display highest value ManyToMany FieldDjango list_display 最高值 ManyToMany 字段
【发布时间】:2021-05-03 15:36:50
【问题描述】:

我想知道如何在管理员的 ManyToMany 字段中显示“最高值”。这是我的models.py 文件:

class Personal(models.Model):
    lastname  = models.CharField(max_length = 100)
    firstname = models.CharField(max_length = 100)
    degree = models.ManyToManyField('Degree')
    
    def __str__(self):
        return self.lastname

class Degree(models.Model):
    name_degree = models.CharField(verbose_name = 'Degree', max_length = 200, blank = False)
    rank = models.PositiveIntegerField(default = 0)

    def __str__(self):
        return self.name_degree

在我的后端,我创建了不同类型的学位,都带有“排名”。就我而言,您可以获得的最高学位是“博士学位”,排名为“6”。

因此,如果用户在“个人”中创建自己,他将可以选择他已获得的所有学位。但是对于我的个人列表,我只想看到最高的,例如如果用户选择“学士学位”和“硕士学位”,则个人列表应该只包含“硕士学位”,因为 5 > 4。

有人知道我的admin.py 文件应该是什么样子吗?

class PersonalAdmin(admin.ModelAdmin):
    list_display = ('lastname', 'firstname', ) # 'degree'

提前致谢!

【问题讨论】:

    标签: python django list django-admin


    【解决方案1】:

    您可以在ModelAdmin 中定义一个方法来计算最大度数:

    class PersonalAdmin(admin.ModelAdmin):
        list_display = ('lastname', 'firstname', 'highest_degree')
    
        @admin.display(description='Highest degree')
        def highest_degree(self, obj):
            deg = Degree.objects.filter(personal=obj).first()
            if deg:
                return deg.name_degree
            return None

    然而,如果我们想要渲染大量 Personals,这将是非常低效的,因为这将需要一个额外的查询 per 项。

    我们可以通过subquery expression 让数据库为我们完成工作:

    from django.db.models import OuterRef, Subquery
    
    class PersonalAdmin(admin.ModelAdmin):
        list_display = ('lastname', 'firstname', 'highest_degree')
    
        def get_queryset(self, request):
            return Personal.objects.annotate(
                highest_degree=Subquery(
                    Degree.objects.filter(
                        personal=OuterRef('pk')
                    ).order_by('-rank').values('name_degree')[:1]
                )
            )
    
        @admin.display(description='Highest degree')
        def highest_degree(self, obj):
            return obj.highest_degree

    这将计算 bulk 中的度数名称。

    【讨论】:

    • 我在 PersonalAdmin 中收到此错误:``` admin.E108) 'list_display[2]' 的值指的是 'highest_degree',它不是可调用的,是 'PersonalAdmin' 的属性,或“data.Personal”上的属性或方法。```
    • @schuhesindbequemer:如果你使用注解,你需要删除highest_degree方法。
    • @schuhesindbequemer:不,那个。您究竟使用这两种解决方案中的哪一种?
    • 第二个,我觉得更好
    • @schuhesindbequemer:方法忘记了,能不能把这个加到ModelAdmin(最后一个函数)
    猜你喜欢
    • 2013-03-07
    • 2014-05-27
    • 1970-01-01
    • 2017-01-15
    • 2011-12-21
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多