列表中的多对多显示django

时间:2013-08-07 16:18:23

标签: python django django-admin admin django-queryset

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

我有那个代码。不幸的是,错误来自带有ManyToManyField

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

错误说:

  

'PurchaseOrderAdmin.list_display [0]','product'是ManyToManyField   这是不受支持的。

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

修改:也许更好的问题是如何在ManyToManyField中展示list_display

3 个答案:

答案 0 :(得分:124)

您可能无法直接进行此操作。 From the documentation of 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()])

并在管理员list_display

list_display = ('get_products', 'vendor')

答案 1 :(得分:9)

通过这种方式,您可以查看以下代码段:

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')

答案 2 :(得分:0)

我想保存额外的查询,您可以添加 prefetch_related


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

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.prefetch_related('product')

    def get_products(self, obj):
        return ",".join([p.products for p in obj.product.all()])