Django:list_display ManyToManyField 排序

Posted

技术标签:

【中文标题】Django:list_display ManyToManyField 排序【英文标题】:Django: list_display ManyToManyField ordering 【发布时间】:2014-07-17 00:26:45 【问题描述】:

我有以下代码:

#models.py
class Repair(models.Model):
    products = models.ManyToManyField(Product)
    description = models.TextField()

    def products_list(self):
        return ', '.join([a.name for a in self.products.all()])

class Product(models.Model):
    name = models.CharField(max_length=50,blank=False)
    description = models.TextField(blank=True)


#admin.py
class RepairAdmin(admin.ModelAdmin):
    list_display = ('products_list', 'description')

如您所见,我使用带有连接的自定义模型字段在 ModelAdmin list_display 属性上显示所有与维修相关的产品,这是正确的。

现在我的问题是:如何使自定义字段排序在 list_display 上?我只想按 ManyToMany relashiontship 上的第一项排序。我尝试在模型上使用以下代码:

products_list.admin_order_field = 'products__name'

包括这一行,我可以激活字段排序,但它无法正常工作...当请求字段排序时,它会在表上显示与关系一样多的记录重复。

我一直在研究,最接近我找到的解决方案是:

Django admin: how to sort by one of the custom list_display fields that has no database field

但我没有看到将其应用于我的案例的正确方法。

【问题讨论】:

【参考方案1】:

您会看到“表上的记录重复数与其拥有的关系一样多”,因为'products__name' 正在获取与Repair 相关的所有Products。

如果您想在您的 ModelAdmin 中按多对多关系 products 上的第一项进行排序,那么创建一个获得第一个产品的 property 可能是最简单的 - 然后将其分配给 admin_order_field

class Repair(models.Model):
    products = models.ManyToManyField(Product)
    description = models.TextField()

    def products_list(self):
        return ', '.join([a.name for a in self.products.all()])

    # add a property which gets the name of the first product
    @property
    def first_product(self):
        self.products.all().first()  # first() was added in 1.6, otherwise use [0]


class RepairAdmin(admin.ModelAdmin):
    list_display = ('products_list', 'description')
    # use that property to only get the first product when ordering
    products_list.admin_order_field = 'first_product__name'

【讨论】:

感谢您的回复,我已尝试应用此代码,但 admin_order_field 属性不接受“first_product__name”值。 django 抛出以下错误: FieldError at /admin/support/repair/ Cannot resolve keyword 'first_product' into field。选项有:描述、ID、产品 这将导致NameError,因为无法分配products_list.admin_order_fieldproducts_list 必须是 RepairAdmin 的方法。但随后似乎仍然无法在此处使用自定义属性。 admin_order_field 必须是模型字段名称,因为排序是由数据库完成的。因此,myfieldrelated_field__name 等可以工作,但myproperty 不行。

以上是关于Django:list_display ManyToManyField 排序的主要内容,如果未能解决你的问题,请参考以下文章

Django:list_display ManyToManyField 排序

相关内联上的python django list_display [重复]

如何在 Django admin 中本地化 list_display 字段?

Django admin list_display模型方法

Django admin list_display 在鼠标悬停时显示全文

Django admin list_display 不显示模型方法返回项