Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:列表\显示多个字段排序_Django_Django Models_Django Admin - Fatal编程技术网

Django:列表\显示多个字段排序

Django:列表\显示多个字段排序,django,django-models,django-admin,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.Mod

我有以下代码:

#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属性上所有与修复相关的产品,这是正确的

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

products_list.admin_order_field = 'products__name'
包括这一行,我可以激活字段排序,但它不能正常工作。。。当请求字段排序时,它在表上显示与其关系相同的记录重复

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

但是我看不到将其应用到我的案例中的正确方法。

您看到的是“表上的记录副本与它的关系一样多”,因为
'products\uu\u name'
正在获得所有与
修复相关的
产品

如果要在ModelAdmin中按多个关系
产品
上的第一项进行排序,那么最简单的方法可能是创建一个
属性
,获取第一个产品,然后将其分配到
管理订单字段

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\u order\u字段属性不接受“first\u product\u name”值。django抛出以下错误:FieldError位于/admin/support/repair/无法将关键字“first_product”解析到字段中。选项包括:描述、id、产品这将导致
名称错误
,因为无法分配
产品列表.管理订单字段
<代码>产品列表
必须是
维修管理
的一种方法。但是,这里似乎仍然不能使用自定义属性。admin_order_字段必须是模型字段名,因为排序是由数据库完成的。因此,
myfield
相关字段名
等可以工作,但不能
myproperty