Подтвердить что ты не робот

Много-ко-многим в списке отображения 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?

4b9b3361

Ответ 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')