Много-ко-многим в списке отображения 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 который не поддерживается.
Однако он компилируется, когда я беру 'product'
из list_display
. Итак, как я могу отображать 'product'
в list_display
без ошибок?
edit. Возможно, лучший вопрос: каким образом вы показываете ManyToManyField
в list_display
?
Ответы
Ответ 1
Возможно, вы не сможете сделать это напрямую. Из документации list_display
Поддерживаются поля ManyToManyField, поскольку это повлечет за собой выполняя отдельный оператор SQL для каждой строки в таблице. если ты вы хотите сделать это, тем не менее, дайте вашей модели собственный метод и добавьте что методы name to 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()])
и в admin list_display
list_display = ('get_products', 'vendor')
Ответ 2
Таким образом, вы можете сделать это, любезно просмотрите следующий фрагмент:
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')