多对多的列表显示django

class PurchaseOrder(models.Model): product = models.ManyToManyField('Product') vendor = models.ForeignKey('VendorProfile') dollar_amount = models.FloatField(verbose_name='Price') class Product(models.Model): products = models.CharField(max_length=256) def __unicode__(self): return self.products 

我有这个代码。 不幸的是,错误来自admin.py与“ManyToManyField”

 class PurchaseOrderAdmin(admin.ModelAdmin): fields = ['product', 'dollar_amount'] list_display = ('product', 'vendor') 

错误说“'PurchaseOrderAdmin.list_display [0]','product'是不支持的ManyToManyField。

但是,当我从“list_display”中取出“product”时会进行编译。 那么如何在list_display中显示“product”而不会出错?

编辑:也许一个更好的问题是如何显示list_display中的ManyToManyField?

您可能无法直接进行。 从list_display的文档

ManyToManyField字段不受支持,因为这将需要为表中的每一行执行单独的SQL语句。 如果你想这样做,给你的模型一个自定义的方法,并将该方法的名称添加到list_display。 (有关在list_display中定制方法的更多信息,请参阅以下内容。)

你可以做这样的事情:

 class PurchaseOrderAdmin(admin.ModelAdmin): fields = ['product', 'dollar_amount'] list_display = ('get_products', 'vendor') def get_products(self, obj): return "\n".join([p.products for p in obj.product.all()]) 

或者定义一个模型方法,并使用它

 class PurchaseOrder(models.Model): product = models.ManyToManyField('Product') vendor = models.ForeignKey('VendorProfile') dollar_amount = models.FloatField(verbose_name='Price') def get_products(self): return "\n".join([p.products for p in self.product.all()]) 

并在pipe理list_display

 list_display = ('get_products', 'vendor') 

这样你可以做到这一点,请检查以下代码片段:

 class Categories(models.Model): """ Base category model class """ title = models.CharField(max_length=100) description = models.TextField() parent = models.ManyToManyField('self', default=None, blank=True) when = models.DateTimeField('date created', auto_now_add=True) def get_parents(self): return ",".join([str(p) for p in self.parent.all()]) def __unicode__(self): return "{0}".format(self.title) 

并在你的admin.py模块中调用方法如下:

 class categories(admin.ModelAdmin): list_display = ('title', 'get_parents', 'when')