Django:list_display ManyToManyField排序

时间:2014-05-27 23:19:04

标签: django django-models django-admin

我有以下代码:

#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版权关系中的第一项进行排序。我尝试在模型上使用以下代码:

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 个答案:

答案 0 :(得分:4)

您看到“表中的记录副本与其拥有的关系一样多”,因为'products__name'正在获取与Product相关的所有Repair }。

如果您想按照ModelAdmin中ManyToMany关系products的第一项进行排序,那么最简单的方法是制作获得第一个产品的property - 然后将其分配给{ {1}}:

admin_order_field