class Product(models.Model):
products = models.CharField(max_length=256)
def __unicode__(self):
return self.products
class PurchaseOrder(models.Model):
product = models.ManyToManyField('Product')
vendor = models.ForeignKey('VendorProfile')
dollar_amount = models.FloatField(verbose_name='Price')
我有密码。不幸的是,该错误出现在admin.py中的ManyToManyField
class PurchaseOrderAdmin(admin.ModelAdmin):
fields = ['product', 'dollar_amount']
list_display = ('product', 'vendor')
错误说:
“PurchaseOrderAdmin.list_display[0]”,“product”是不受支持的ManyToManyField。
但是,当我从list_display
中取出'product'
时,它会编译。那么,如何在list_display
中显示'product'
而不出错呢?
edit:也许更好的问题是如何在list_display
中显示ManyToManyField
?
4条答案
按热度按时间llycmphe1#
你可能无法直接做到。来自
list_display
的文档不支持ManyToManyField字段,因为这需要为表中的每一行执行单独的SQL语句。如果您仍然想这样做,请为您的模型提供一个自定义方法,并将该方法的名称添加到list_display。(有关list_display中的自定义方法的更多信息,请参见下文。)
你可以这样做:
或者定义一个模型方法,并使用它
在admin
list_display
中nhaq1z212#
这样你就可以做到这一点,请检查以下片段:
并在你的admin.py模块中调用方法如下:
gr8qqesn3#
如果你想保存额外的查询,你可以在
get_queryset
方法中使用prefetch_related,如下所示:根据文档,这样,只需要一个额外的查询来获取所有
PurchaseOrder
示例的相关Product
项,而不是每个PurchaseOrder
示例都需要一个查询。tcomlyy64#
例如,
Category
和Product
模型具有多对多关系,如下所示。* 我使用Django 4.2.1:然后,有
Category
和Product
管理员,如下所示:然后,
Category
admin有5个对象,如下所示:Product
admin有6个对象,如下所示:现在,用@admin.display()定义
get_products
和get_categories()
,然后分别在Category
和Product
管理员中将它们设置为list_display,如下所示。*@admin.display()
中的description
参数可以将Django Admin中的列分别从GET PRODUCTS
和GET CATEGORIES
重命名为PRODUCTS
和CATEGORIES
:然后,
PRODUCTS
列在Category
admin中显示如下:然后,
CATEGORIES
在Product
admin中显示如下:此外,您还可以通过在
Category
和Product
型号中分别定义get_products()
和get_categories()
和@admin.display()
来显示PRODUCTS
和CATEGORIES
列,如下所示:然后在
Category
和Product
管理员中分别设置为list_display
,如下所示: