我有很多这样的领域:
class Retailer(models.Model):
name = models.CharField(max_length=100, db_index=True)
city_gps = models.ManyToManyField(City, blank=True, related_name='retailers', db_index=True)
def __str__(self):
retailer_city = ""
if self.city_gps:
retailer_city = self.city_gps.all().first().name
return slugify(self.name) + slugify(retailer_city)
我希望管理员显示名称和所有相关城市的组合。但是,当我将管理员设置为显示此字段时:
class RetailerAdmin(admin.ModelAdmin):
search_fields = ['name']
list_display = ['name', 'city_gps', 'icon_tag', 'logo_tag', 'header_tag']
我收到错误:
:( admin.E109)的值 'list_display [1]'不能是ManyToManyField。
那么,我该如何解决这个问题呢?有没有办法在管理员中显示__str__
方法的价值?
答案 0 :(得分:1)
正如the docs for list_display
in Django所说:
不支持
ManyToManyField
个字段,因为这需要为表中的每一行执行单独的SQL语句。如果您想要这样做,请为您的模型提供自定义方法,并将该方法的名称添加到list_display
。 (有关list_display
中自定义方法的更多信息,请参见下文。)
因此,您可以直接在models.py
中使用admin.py
或(我认为更多explicit方式)定义此自定义方法:
class RetailerAdmin(admin.ModelAdmin):
search_fields = ['name']
list_display = ['name', 'icon_tag', 'logo_tag', 'header_tag', 'retailer_city']
def retailer_city(self, obj):
city_gps = obj.city_gps
retailer_city = city_gps.all().first().name if city_gps else ''
return slugify(obj.name) + slugify(retailer_city)
请注意,retailer_city
中添加了list_display
。