web-dev-qa-db-ja.com

リスト表示の多対多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を表示するにはどうすればよいですか?

編集list_displayManyToManyFieldを表示するにはどうすればよいでしょうか?

66
Mdjon26

直接実行できない場合があります。 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')
130
karthikr

このようにして、次のスニペットを確認してください。

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