muchos a muchos en la lista de visualización de 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 

Tengo ese código. Desafortunadamente, el error viene en admin.py con el ManyToManyField

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

El error dice:

‘PurchaseOrderAdmin.list_display [0]’, ‘product’ es un ManyToManyField que no es compatible.

Sin embargo, se comstack cuando saco el 'product' de list_display . Entonces, ¿cómo puedo mostrar el 'product' en list_display sin dar errores?

edición : tal vez una mejor pregunta sería cómo mostrar un ManyToManyField en list_display ?

Es posible que no pueda hacerlo directamente. De la documentación de list_display

Los campos ManyToManyField no son compatibles, ya que eso implicaría ejecutar una instrucción SQL separada para cada fila en la tabla. No obstante, si desea hacer esto, dele un método personalizado a su modelo y agregue el nombre de ese método a list_display. (Ver más abajo para más información sobre métodos personalizados en list_display).

Puedes hacer algo como esto:

 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()]) 

O defina un método modelo, y use ese

 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()]) 

y en el admin list_display

 list_display = ('get_products', 'vendor') 

De esta manera puedes hacerlo, por favor revisa el siguiente fragmento de código:

 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) 

Y en su módulo de admin.py llame al método de la siguiente manera:

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