1. ホーム
  2. python

[解決済み] リスト表示での多対多 Django

2022-10-06 10:15:07

質問

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 をエラーにしないようにするには?

編集 : より良い質問は、どのようにして ManyToManyFieldlist_display ?

どのように解決するのですか?

直接できない場合があります。 のドキュメントから list_display

ManyToManyField フィールドは、テーブルの各行に対して個別の SQL 文を実行する必要があるため、サポートされていません。 なぜなら、テーブルの各行に対して個別の SQL 文を実行する必要があるからです。それでも を実行したい場合は、モデルにカスタムメソッドを作成し、そのメソッド名を list_display に追加してください。 そのメソッドの名前を 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')